2012-02-16 12 views

risposta

24

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 per ulteriori documenti e guide.

+0

Assolutamente corretto. –

+0

Capito: questo caricherà il byte dall'indirizzo '% eax +% ecx + 1' ed espanderlo a lungo con uno zero iniziale. Molte grazie! –

13

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 è:

  • MOV
  • Zero estendere
  • byte (8 bit)
  • a lungo (32 bit)

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.

+0

@downvoters si prega di spiegare :-) –

+0

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). –