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