2016-05-16 8 views
0

Also sagen wir, ich habe ein Ergebnis von mul in dx:ax, wie kann ich es speichern, um dword [ebx] ??Wie speichern Sie ein zwei-Register-mul Ergebnis in Speicher

Ich habe das gleiche Problem mit Doppelwörtern: EDX (hohe Hälfte) und EAX (niedrige Hälfte) zu zwei dwords zeigte durch [ebx].

+3

Verwenden Sie zwei 'mov's:' mov [ebx], ax'/'mov [ebx +2], dx' – Michael

+0

Dies sollte eine Antwort sein. – jcoder

+0

Und was ist mit eax und edx? +4? – formateu

Antwort

2

Wie bereits von Kommentatoren Michael und Ped7g gesagt, haben Sie Offsets. Lassen Sie mich erklären:

X86 speichert Zahlen im Little-Endian-Format, was bedeutet, dass die niedrigste Byte zuerst im Speicher gespeichert werden. Ein kleines Beispiel: Angenommen, Sie den Wert 0x12345678 in eax haben, und Sie diesen Befehl ausführen:

mov [addr], eax 

... dann wird der Speicher an der Adresse addr wird wie folgt aussehen:

78 56 34 12 

In Ihrem Beispiel , Sie haben einen Wert in dx:ax, die eine Abkürzung für "haben die oberen 16 Bits eines Werts in dx und seine unteren 16 Bits in ax". Angenommen, der Wert ist, wieder, 0x12345678, so haben Sie 0x1234 in dx und 0x5678 in ax, dann müssen Sie zwei Bewegungsanweisungen:

mov [addr], ax // Memory now looks like this: 78 56 
mov [addr+2], dx // Memory now looks like this: 78 56 34 12 

Die +2 kommt von der Tatsache, dass ax ist ein 16-Bit-Register, das heißt Es verbraucht zwei Bytes, wenn es im Speicher gespeichert wird. Da Sie dx direkt danach einfügen möchten, müssen Sie die Adresse um 2 erhöhen.

Gleiches gilt für 64-Bit-Werte in edx und eax, mit einem Offset 4. Nehmen wir an, Sie den Wert 0x1234567890ABCDEF Split 0x12345678 in edx und 0x90ABCDEF in eax haben, dann wäre es wie folgt aussehen:

mov [addr], eax // Memory now looks like this: EF CD AB 90 
mov [addr+4], edx // Memory now looks like this: EF CD AB 90 78 56 34 12