Molte istruzioni x86 Intel/AMD sono disponibili in formato "modrm" - hanno due operandi, uno dei quali deve essere un registro, l'altro dei quali può essere un registro o un riferimento di memoria, il cui indirizzo è determinato dal byte modrm della codifica dell'istruzione, e possibilmente dai byte successivi dell'istruzione, come il sib (byte dell'indice scalato) e la costante costante/offset di memoria. E anche da un possibile prefisso di segmento byte.
Di solito questi sono REG, istruzioni reg/mem, della forma
rsrcdst += rsrc
or
rsrcdst += Memory[ ... addressessing mode ...]
Ma il codice assembly x86 non ha codici operativi separati/mnemonica di istruzioni per la reg, reg e reg, forme mem di queste istruzioni. Se un operando è un registro o una posizione di memoria è indicato, nell'assemblatore, dalla sintassi dell'assembly.
In questo caso, il codice assembly è
MOVSX ECX, BYTE PTR DS: [EDX]
L'istruzione codice operativo è MOVSX.
L'operando di destinazione è registrato ECX.
L'operando di origine è "BYTE PTR DS: [EDX]". Che questo è un riferimento di memoria è indicato da diverse cose: (1) le parentesi quadre intorno a "[EDX]" - parentesi quadre sono una scorciatoia per Memoria [...indirizzo...]. (2) il prefisso "DS:", che indica che si trova nel segmento dati. Gli operandi di registro non hanno un prefisso di questo tipo. (3) "BYTE PTR" - che dice "prendi l'indirizzo di memoria specificato da 'DS: [EDX]', e interpretalo come riferimento a un byte di 8 bit in memoria".
ho il sospetto che ciò che si vuole veramente è
MOVSX ECX,DL
"DL" è un nome per le basse 8 bit di 32 bit del registro EDX. Cioè DL = EDX.bits [7: 0]. Purtroppo, assemblatori x86 di solito don; t accettare la sintassi del tipo "EDX.bits [7: 0]" (a meno che non li ho scritto), quindi bisogna conoscere i nomi storici dei registri secondari:
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
e così on: BL, CL, DL, DI, ...