Che cosa esattamente le istruzioniCosa fa l'istruzione MOVZBL nella sintassi AT & T IA-32?
movzbl 0x01(%eax,%ecx),%eax
fa?
Che cosa esattamente le istruzioniCosa fa l'istruzione MOVZBL nella sintassi AT & T IA-32?
movzbl 0x01(%eax,%ecx),%eax
fa?
AT & sintassi T divide il movzx
Intel instruction mnemonic in diverse mnemonica per diverse dimensioni di sorgente (movzb
vs movzw
). Nella sintassi Intel, è:
movzx eax, byte ptr [eax+ecx+1]
cioè caricare un byte dalla memoria eax + ecx + 1 e zero estendersi a pieno registro.
BTW, la maggior parte degli strumenti GNU ora ha un'opzione switch o config per preferire la sintassi Intel. (Come ad esempio objdump -Mintel
o gcc -S -masm=intel
, anche se quest'ultimo influenza la sintassi utilizzata durante la compilazione di inline-asm). Consiglierei sicuramente di esaminarlo, se non si fa l'assemblaggio T AT & per vivere. Vedi anche il tag wiki x86 per ulteriori documenti e guide.
Assolutamente corretto. –
Capito: questo caricherà il byte dall'indirizzo '% eax +% ecx + 1' ed espanderlo a lungo con uno zero iniziale. Molte grazie! –
Esempio:
mov $0x, %eax
mov $1, %bl
movzbl %bl, %eax
# %eax == 0000 0001
mov $0x, %eax
mov $-1, %bl
movzbl %bl, %eax
# %eax == 0000 00FF
La mnemonica è:
Esistono anche versioni per altre dimensioni:
movzbw
: Byte (8-bit) per Word (16 bit)movzwl
: Word (16 bit) a lungo (32 bit)Come la maggior parte istruzioni GAS, è possibile omettere l'ultimo carattere dimensioni quando si tratta di registri:
movzb %bl, %eax
ma non riesco a capire il motivo per cui non possiamo omettere il penultimo lett er, ad es. il seguente esito negativo:
movz %bl, %eax
Perché non solo dedurre dalla dimensione degli operandi quando sono registri come ad mov
e la sintassi Intel?
E se si utilizza registri della taglia sbagliata, non riesce a compilare es .:
movzb %ax, %eax
Runnable Intel example with assertions on GitHub.
@downvoters si prega di spiegare :-) –
Se si [guarda gli opcode] (http://www.felixcloutier.com/x86/MOVZX.html), la "dimensione dell'operando" controlla la dimensione della destinazione ma ci sono diversi codici opcode per diverse dimensioni di sorgente. Quindi ha senso che il gas tratti "movzb" come un'istruzione separata da "movzw". (Per l'estensione del segno, AMD ha persino aggiunto un nuovo mnemonico di sintassi Intel per 'movsxd r64, r/m32' invece di sovraccaricare ulteriormente' movsx'. Perché IDK). –
stesso per movsbl: http://stackoverflow.com/questions/7861095/what-does-movsbl-instruction-do –