Sto seguendo il corso Baking Pi dall'Università di Cambridge, in cui un semplice sistema operativo è integrato nel set di istruzioni ARMv6, destinato al Raspberry Pi.Qual è la differenza tra = etichetta (segno di uguale) e [etichetta] (parentesi) nell'assemblaggio ARMv6?
Abbiamo utilizzato due metodi per caricare i dati nei registri tramite l'istruzione ldr
e ora mi rendo conto che li sto utilizzando insieme, non capisco perfettamente cosa fanno entrambi.
le cose in modo che ho usato come ldr r0,=0x20200000
, che io in realtà intesa come "leggere i dati memorizzati nella posizione di memoria 0x20200000 nel registro R0
cose allora ho usato come:.
ldr r0,[r1,#4]
che ho capito come "leggere i dati memorizzati presso l'indirizzo di memoria puntato da r1, a un offset di 4 byte, nel registro r0"
Poi ho incontrato questo:.
ldr r0,=pattern
ldr r0,[r0]
pattern
ecco un .int
nella sezione .data
(un bitmap che rappresenta una sequenza di stati ON/OFF per un LED). Mi rendo conto, leggendo questo, che la mia precedente comprensione di =foo
deve essere errata, altrimenti entrambe le istruzioni di cui sopra farebbero la stessa cosa.
è il =x
sintassi fondamentalmente più simile a un puntatore in C, mentre la sintassi [x]
è come se la memoria che viene puntato da x
è effettivamente leggere?
Diciamo che ptr
nella C di seguito è un int*
, i miei commenti che pensano all'assemblaggio equivalente (concettualmente, non letteralmente) hanno senso?
r0 = ptr; /* equivalent to: ldr r0,=ptr */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */
Eventuali duplicati: 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-error-with-ldr-parameters –