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!

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top