BRAS de montage: auto-incrément de vous inscrire sur la boutique

Est-il possible de l'auto-incrémentation de l'adresse de base d'un registre sur un STR avec un [Rn]!? J'ai regardé à travers la documentation, mais qui n'ont pas été en mesure de trouver une réponse définitive, principalement parce que la syntaxe de la commande est présentée pour les deux LDR et STR - en théorie, il devrait fonctionner pour les deux, mais je ne pouvais pas trouver des exemples d'auto-incrémentation sur un magasin (le chargement fonctionne ok).

J'ai fait un petit programme qui stocke deux nombres dans un vecteur. Quand c'est fait, le contenu de out devrait être {1, 2}, mais le magasin remplace le premier octet, comme si l'incrémentation automatique ne fonctionne pas.

#include <stdio.h>

int main()
{
        int out[]={0, 0};
        asm volatile (
        "mov    r0, #1          \n\t"
        "str    r0, [%0]!       \n\t"
        "add    r0, r0, #1      \n\t"
        "str    r0, [%0]        \n\t"
        :: "r"(out)
        : "r0" );
        printf("%d %d\n", out[0], out[1]);
        return 0;
}

EDIT:
Alors que la réponse était la bonne pour des chargements et des magasins, j'ai trouvé que l'optimiseur bousille l'auto-incrémentation sur le vecteur des instructions comme vldm/vstm. Par exemple, le programme suivant

#include <stdio.h>

int main()
{
        volatile int *in = new int[16];
        volatile int *out = new int[16];

        for (int i=0;i<16;i++) in[i] = i;

        asm volatile (
        "vldm   %0!, {d0-d3}            \n\t"
        "vldm   %0,  {d4-d7}            \n\t"
        "vstm   %1!, {d0-d3}            \n\t"
        "vstm   %1,  {d4-d7}            \n\t"
        :: "r"(in), "r"(out)
        : "memory" );

        for (int i=0;i<16;i++) printf("%d\n", out[i]);
        return 0;
}

compilé avec

g++ -O2 -march=armv7-a -mfpu=neon main.cpp -o main

produira charabia sur la sortie de la dernière 8 variables, car l'optimiseur est de garder la variable incrémentée et de l'utiliser pour le printf. En d'autres termes, out[i] est en fait out[i+8], de sorte que les 8 premières valeurs imprimées sont les 8 derniers à partir du vecteur et le repos sont des emplacements de mémoire en dehors des limites.

J'ai essayé avec différentes combinaisons de la volatile mot-clé dans tout le code, mais les changements de comportement que si je compile avec le -O0 drapeau ou si j'utilise un volatile vecteur au lieu d'un pointeur et de nouveau, comme

volatile int out[16];
InformationsquelleAutor John S | 2012-02-01