2010-01-08 10 views

Antwort

34

[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.

+4

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

+4

ja. und wenn du 'mov ebx, L1 - mov al, [ebx]' tust, dann wäre 'al' in diesem Fall auch 'w'. – Earlz

+3

Die Ausnahme ist LEA. –

5

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.

1

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.

1

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 Last
mov al, [ebx] 

Auch bekannt.

0

Es zeigt an, dass das Register als Zeiger für die tatsächliche Position verwendet werden sollte, anstatt auf das Register selbst zu wirken.

25

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

+0

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

+11

@ user2485710 Nein, "* p" bedeutet die Dereferenzierung der durch "p" angegebenen Zeichenkette. Strings haben damit nichts zu tun. – Navin

20

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.

Verwandte Themen