Je suis avec le cours Baking Pi de l'Université de Cambridge, dans lequel un système d'exploitation simple est construit dans le jeu d'instructions ARMv6, ciblant le Raspberry Pi.Quelle est la différence entre = label (signe égal) et [label] (parenthèses) dans l'assemblage ARMv6?
Nous avons utilisé deux façons de charger des données dans des registres via l'instruction ldr
jusqu'à présent et je me rends compte maintenant que je les utilise ensemble, je ne comprends pas complètement ce qu'ils font tous les deux.
J'ai utilisé des choses comme ldr r0,=0x20200000
, que je réellement compris comme « lire les données stockées à l'emplacement de mémoire 0x20200000 dans r0 registre
J'ai utilisé des choses comme:.
ldr r0,[r1,#4]
ce que j'ai compris comme étant « lire les données stockées à l'adresse de mémoire pointée par r1, à un décalage de 4 octets, dans le registre r0 »
Puis je rencontre ceci:.
ldr r0,=pattern
ldr r0,[r0]
pattern
est ici un .int
dans la section .data
(un bitmap représentant une séquence d'états de marche/arrêt pour une LED). Je me rends compte en lisant cela, que ma compréhension précédente de =foo
doit être fausse, sinon les deux instructions ci-dessus feraient la même chose.
Est-ce que la syntaxe =x
ressemble plus à un pointeur en C, alors que la syntaxe [x]
est comme si la mémoire pointée par x
est réellement lue?
Disons ptr
dans le C ci-dessous est un int*
, faire mes commentaires en pensant à l'assemblage équivalent (conceptuellement, pas littéralement) ont un sens?
r0 = ptr; /* equivalent to: ldr r0,=ptr */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */
double possible: http: // stackove rflow.com/questions/14046686/ldr-vs-mov-arm-assembly http://stackoverflow.com/questions/9374703/llvm-gcc-assembler-ldr-syntax http://stackoverflow.com/questions/9735169/ iphone-assembly-compilation-erreur-avec-ldr-paramètres –