Che cosa è (% eax) nella sintassi AT & amp; T?
-
06-07-2019 - |
Domanda
Dovrai scusarmi, sono nuovo di zecca nell'assemblaggio x86 e nell'assemblaggio in generale.
Quindi la mia domanda è, ho qualcosa del tipo:
addl %edx,(%eax)
% eax è un registro che contiene un puntatore a un numero intero. Chiamiamolo xp
Questo significa che sta dicendo: * xp = * xp +% edx
? (% edx
è un numero intero)
Sono solo confuso dove addl memorizzerà il risultato. Se % eax
è un puntatore a un int, allora (% eax)
dovrebbe essere il valore effettivo di tale int. Quindi addl
memorizzerebbe il risultato di % edx + (% eax)
in * xp
? Mi piacerebbe davvero che qualcuno me lo spiegasse!
Apprezzo davvero qualsiasi aiuto!
Soluzione
Sì, questa istruzione sta facendo esattamente quello che pensi stia facendo.
La maggior parte delle istruzioni aritmetiche x86 accetta due operandi: una sorgente e una destinazione. Nella sintassi AT & amp; (usata qui), la destinazione è sempre l'operando giusto. Quindi con un'istruzione come:
addl %edx, %eax
i valori in edx
e eax
vengono sommati e il risultato viene archiviato in eax
. Tuttavia, nel tuo esempio, (% eax)
è un operando di memoria; questo è il significato delle parentesi nella sintassi AT & amp; T (come parentesi quadre nella sintassi NASM).
Ciò significa che eax
viene trattato come un puntatore, quindi l'operando giusto viene preso dall'indirizzo indicato da eax
e il risultato viene memorizzato allo stesso indirizzo .