web-dev-qa-db-fra.com

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

Quelle est exactement l'instruction

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

est-ce que?

34
user663896

La syntaxe AT&T divise la movzx mnémonique de l'instruction Intel en différentes mnémoniques pour différentes tailles de source (movzb contre movzw). Dans la syntaxe Intel, c'est:

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

c'est-à-dire charger un octet de la mémoire à eax + ecx + 1 et étendre zéro 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 cette dernière affecte la syntaxe utilisée lors de la compilation inline-asm). Je recommanderais certainement de l'examiner si vous ne faites pas d'assemblage AT&T pour vivre. Voir aussi le x86 wiki wiki pour plus de documents et de guides.

36
Igor Skochinsky

Exemple minimal

mov $0x01234567, %eax
mov $1, %bl
movzbl %bl, %eax
/* %eax == 0000 0001 */

mov $0x01234567, %eax
mov $-1, %bl
movzbl %bl, %eax
/* %eax == 0000 00FF */

Runanble GitHub en amont avec assertions .

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) à Word (16 bits)
  • movzwl: Word (16 bits) à Long (32 bits)

Comme la plupart des instructions GAS, vous pouvez omettre le dernier caractère de taille lorsque vous traitez avec des registres:

movzb %bl, %eax

mais je ne comprends pas pourquoi nous ne pouvons pas omettre l'avant-dernière lettre, par exemple l'échec suivant:

movz %bl, %eax

Pourquoi ne pas simplement le déduire de la taille des opérandes lorsqu'ils sont des registres comme pour mov et la syntaxe Intel?

Et si vous utilisez des registres de mauvaise taille, il ne parvient pas à se compiler, par exemple:

movzb %ax, %eax