Frage

Sie werden mich entschuldigen, ich bin ganz neu zu x86-Montage und Montage im Allgemeinen.

Also meine Frage ist, ich habe so etwas wie:

addl %edx,(%eax)

% eax ist ein Register, das einen Zeiger zu einem gewissen ganzen Zahl enthält. Nennen wir es xp

Bedeutet dies, dass es sagt: *xp = *xp + %edx? (%edx ist eine ganze Zahl)

Ich bin nur verwirrt, wo addl wird das Ergebnis gespeichert werden. Wenn %eax ein Zeiger auf ein int ist, dann sollte (%eax) der Ist-Wert des int sein. So würde addl das Ergebnis %edx+(%eax) in *xp speichern? Ich würde wirklich lieben, für jemanden, mir dies zu erklären!

Ich schätze wirklich jede Hilfe!

War es hilfreich?

Lösung

Ja, dieser Befehl tut genau das, was Sie denken, es tut.

Die meisten x86 arithmetische Befehle zwei Operanden: eine Quelle und ein Ziel. In der AT & T-Syntax (hier verwendete), ist das Ziel immer die richtigen Operanden. So mit einem Befehl wie:

addl %edx, %eax

die Werte in edx und eax werden addiert und das Ergebnis wird in eax gespeichert. Doch in Ihrem Beispiel (%eax) ist ein Speicheroperanden; das ist, was in AT & T-Syntax (wie Quadrat-Klammern in NASM Syntax) Mittelwert Klammern.

Das bedeutet, dass eax als Zeiger behandelt wird, so dass der rechte Operand wird von der Adresse, auf die durch genommen eax, und das Ergebnis an die gleiche Adresse gespeichert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top