2015-10-21 21 views
5

che modo le istruzioni di montaggio lavoro MOVSX in questo esempio che segue:Come funzionano le istruzioni di assemblaggio MOVSX?

MOVSX ECX,BYTE PTR DS:[EDX]

In questo caso, qui lo stato dei registri:
ECX = 0000000F
EDX = 0012FD9F

Da quello che ho pensato, prende gli ultimi byte di [EDX] = 9F, lo sposta in ECX e quindi firma lo estende per corrispondere a 16 bit = 0000009F. Tuttavia, il risultato effettivo è 00000016. Qualcuno può aiutare a spiegare dove ho sbagliato?

risposta

4

Questo è parzialmente corretto. Tuttavia:

BYTE PTR DS:[EDX] ottiene il byte situato all'indirizzo in EDX. Questo byte viene copiato in ECX nel byte meno significativo e il resto viene riempito con il segno del byte.

Per il vostro risultato inatteso, ciò significa che a l'indirizzo di memoria 0x12FD9F il byte 0x16 si trova.


Note:

  • Segment Prefix Override DS: non è necessario qui. [EDX] si riferisce automaticamente a DS.

"indirizzo di memoria" si riferisce a uno virtuale o memoria fisica qui

1

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