Bedeutung von (% EAX) in AT & T-Syntax?
-
06-07-2019 - |
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!
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.