2015-10-21 77 views
5

Wie funktioniert die Montageanleitung MOVSX Arbeit in diesem folgende Beispiel:Wie funktioniert MOVSX Montageanleitung?

MOVSX ECX,BYTE PTR DS:[EDX]

In diesem Fall ist hier der Zustand der Register:
ECX = 0000000F
EDX = 0012FD9F

Von dem, was ich dachte, es dauert die letzten Bytes von [EDX] = 9F, verschiebt es zu ECX und dann verlängert es sich, um 16 Bits = 0000009F zu entsprechen. Das tatsächliche Ergebnis ist jedoch 00000016. Kann jemand erklären, wo ich falsch liege?

Antwort

4

Das ist teilweise richtig. Jedoch:

BYTE PTR DS:[EDX] erhält das Byte an der Adresse in EDX gehalten. Dieses Byte wird in das niedrigstwertige Byte nach ECX kopiert und der Rest wird mit dem Vorzeichen des Bytes gefüllt.

Für Ihr unerwartetes Ergebnis bedeutet dies, dass an der Speicheradresse 0x12FD9F das Byte 0x16 befindet.


Hinweise:

  • das Segment außer Kraft setzen Präfix DS: ist hier nicht erforderlich. [EDX] bezieht sich automatisch auf DS.

"Speicheradresse" bezieht sich entweder virtuelle oder physische Speicher hier

1

Viele Intel/AMD x86-Befehle in "modrm" Format verfügbar sind - sie haben zwei Operanden, von denen muß ein Register sein, von denen das andere ein Register oder eine Speicherreferenz sein kann, deren Adresse durch das Modrm-Byte der Befehlscodierung bestimmt ist, und möglicherweise durch nachfolgende Bytes des Befehls, wie das sib (skaliertes Indexbyte) und die sofortige Konstante/Speicheroffset. Und auch durch ein mögliches Segment-Präfix-Byte.

Normalerweise sind diese reg, reg/mem Anweisungen des Formulars

rsrcdst += rsrc 
or 
    rsrcdst += Memory[ ... addressessing mode ...] 

Aber x86-Assembler-Code hat keine separaten Opcodes/Befehlsmnemoniks für die reg, reg und reg, mem Formen dieser Anweisungen. Ob ein Operand ein Register oder ein Speicherort ist, wird im Assembler durch Assembly-Syntax angegeben.

In diesem Fall Ihren Assembler-Code

MOVSX ECX ist, BYTE PTR DS: [EDX]

Der Befehlsopcode ist MOVSX.

Der Zieloperand ist das Register ECX.

Der Quelloperand ist "BYTE PTR DS: [EDX]". Dass dies eine Speicherreferenz ist, wird durch mehrere Dinge angezeigt: (1) die eckigen Klammern um "[EDX]" - eckige Klammern sind eine Kurzschrift für Memory [...]Adresse...]. (2) das Präfix "DS:", das anzeigt, dass es sich im Datensegment befindet. Registeroperanden haben kein solches Segmentpräfix. (3) der "BYTE PTR" - der sagt "nimm die Speicheradresse, die durch 'DS: [EDX]' spezifiziert ist, und interpretiere sie als Bezug auf ein 8-Bit-Byte im Speicher".

Ich vermute, dass das, was Sie wirklich wollen,

MOVSX ECX,DL 

"DL" ist ein Name für die niedrigen 8 Bits des 32-Bit-Register EDX ist. I.e. DL = EDX.bits [7: 0]. Leider don x86 Monteure in der Regel; t akzeptieren Syntax wie "EDX.bits [7: 0]" (es sei denn, ich schrieb sie), so dass man die historischen Namen der Unterregister wissen müssen:

AL = EAX.bits[7:0] 
AH = EAX.bits[15:8] 
AX = EAX.bits[15:0] 
EAX = 32 bit register that "covers" all of the above 

und so an: BL, CL, DL, DI, ...