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
Verwenden Sie zwei 'mov's:' mov [ebx], ax'/'mov [ebx +2], dx' – Michael
Dies sollte eine Antwort sein. – jcoder
Und was ist mit eax und edx? +4? – formateu