den folgenden Code Gegeben:Was bedeuten die Klammern in x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
Was bedeuten die Klammern ([L1])?
den folgenden Code Gegeben:Was bedeuten die Klammern in x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
Was bedeuten die Klammern ([L1])?
[L1]
bedeutet der Speicherinhalt an Adresse L1. Nach dem Ausführen von mov al, [L1]
hier, das al
Register wird das Byte an Adresse L1 (der Buchstabe 'w') erhalten.
Die Klammern bedeuten, dass eine Adresse referenziert wird. Zum Beispiel
mov eax, [1234]
Mittel, mov den Inhalt der Adresse 1234 EAX. Also:
1234 00001
EAX enthält 00001.
Wie bei vielen Assemblersprachen, bedeutet dies indirection. Mit anderen Worten, der erste mov
lädt al
mit dem InhaltL1
(das Byte 'w'
mit anderen Worten), nicht die Adresse.
Ihre zweite mov
lädt tatsächlich eax
mit der AdresseL1
und Sie können dereferenzieren, dass später auf ihren Inhalt und festlegen.
In beiden Fällen wird L1
konzeptionell als die Adresse betrachtet.
Sie bedeuten statt, dass der Wert des Registers oder einen numerischen Wert des Bewegens L1
in das Register al
, den Registerwert oder einen numerischen Wert L1
als Zeiger in den Speicher behandeln, um den Inhalt dieser Speicheradresse holen, und bewegen sich, dass der Inhalt in al
.
In diesem Fall ist L1 ein Speicherplatz, aber die gleiche Logik gilt, wenn ein Registername in den Klammern war:
als Lastmov al, [ebx]
Auch bekannt.
Es zeigt an, dass das Register als Zeiger für die tatsächliche Position verwendet werden sollte, anstatt auf das Register selbst zu wirken.
Direct memory addressing - al
wird mit dem Wert geladen, der sich unter der Speicheradresse L1
befindet.
Einfach bedeutet, den Speicher an die Adresse mit der Bezeichnung L1 zu bekommen.
Wenn Sie C mögen, denken Sie dann es wie folgt aus: [L1]
ist die gleiche wie *L1
das kann verwirrend sein, da in C '* p' bedeutet, dass _dereference p und stop abholen chars, wenn Sie erreichen '\ 0'_ und nicht nur _dereference das erste Zeichen in der Sequenz/string wies von p_ – user2485710
@ user2485710 Nein, "* p" bedeutet die Dereferenzierung der durch "p" angegebenen Zeichenkette. Strings haben damit nichts zu tun. – Navin
Operanden dieser Art, wie [ebp]
werden memory operands genannt.
Alle Antworten hier sind gut, aber ich sehe, dass keine über dem Vorbehalt, erzählt in folgenden dies als eine starre Regel - wenn Klammern, dann dereferenzieren, außer wenn es die Anweisung lea
.
lea
ist eine Ausnahme zu der obigen Regel. Sagen wir
mov eax, [ebp - 4]
Der Wert von ebp
subtrahiert von 4 und die Klammern haben, dass der resultierende Wert als eine Adresse genommen wird und der Wert an dieser Adresse wohnen in eax
gespeichert. Doch in lea
‚s Fall würden die Klammern nicht bedeuten, dass:
lea eax, [ebp - 4]
Der Wert von ebp
von 4 subtrahiert und der resultierende Wert wird in eax
gespeichert. Dieser Befehl würde nur die Adresse berechnen und den berechneten Wert im Zielregister speichern. Weitere Details finden Sie unter this post.
Danke für Ihre Antwort, ich fange an, asm zu lernen. Wenn ich das richtig verstehe, würde "mov al, [L1]" "w" in al bewegen, und "mov eax, L1" würde die Adresse von L1 in eax verschieben. Ist das korrekt? – joek1975
ja. und wenn du 'mov ebx, L1 - mov al, [ebx]' tust, dann wäre 'al' in diesem Fall auch 'w'. – Earlz
Die Ausnahme ist LEA. –