Que fait L'instruction MOVZBL dans la syntaxe IA-32 AT&T?

qu'est-Ce exactement l'instruction

movzbl  0x01(%eax,%ecx),%eax

fait?

28

2 réponses

La syntaxe

AT&T divise la movzx Intel instruction mnemonic en différentes mnémoniques pour différentes tailles de sources ( movzb vs. movzw ). Dans la syntaxe Intel, c'est:

movzx eax, byte ptr [eax+ecx+1]

, c'est-à-dire charger un octet de mémoire à eax+ecx+1 et zéro-étendre jusqu'au registre complet.

BTW, la plupart des outils GNU ont maintenant un commutateur ou une option de configuration pour préférer la syntaxe Intel. (Tels que objdump -Mintel ou gcc -S -masm=intel , bien que le ci affecte la syntaxe utilisée lors de la compilation inline-asm). Je recommanderais certainement d'examiner cela, si vous ne faites pas AT&T assembly pour la vie. Voir aussi le wiki de l'étiquette pour plus de docs et de guides.

30
répondu Igor Skochinsky 2016-07-23 03:10:52

exemple:

mov "151900920"x01234567, %eax
mov , %bl
movzbl %bl, %eax
# %eax == 0000 0001

mov "151900920"x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
# %eax == 0000 00FF

Le mnémonique est:

  • MOV
  • extension Zéro
  • Octet (8 bits)
  • à Long (32 bits)

il existe également des versions pour d'autres tailles:

  • movzbw : Octet (8 bits) Mot (16 bits)
  • movzwl : mot (16-bit) à Long (32-bit))

comme la plupart des instructions de gaz, vous pouvez omettre le dernier caractère de taille lorsqu'il s'agit de registres:

movzb %bl, %eax

mais je ne comprends pas pourquoi nous ne pouvons pas omettre la dernière lettre avant, par exemple la suivante échoue:

movz %bl, %eax

pourquoi ne pas simplement le déduire de la taille des opérandes quand elles sont des registres comme pour mov et la syntaxe Intel?

et si vous utilisez des registres de la mauvaise taille, il ne compile pas, par exemple:

movzb %ax, %eax

Praticable Intel exemple avec des assertions sur GitHub .

15