Question

Qu'est-ce exactement l'instruction

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

fait?

Était-ce utile?

La solution

AT & T syntaxe sépare les movzx instruction Intel mnémoniques dans différentes mnémoniques pour les tailles de sources différentes ( movzb vs. movzw). Dans la syntaxe Intel, il est:

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

i.e.. charger un octet de la mémoire à eax + ecx + 1 et zéro étendent à registre complet.

BTW, la plupart des outils de GNU ont maintenant un commutateur ou d'une option de configuration à préférer la syntaxe Intel. (Tel que objdump -Mintel ou gcc -S -masm=intel, bien que celle-ci affecte la syntaxe utilisée lors de la compilation en ligne-asm). Je recommande d'examiner, si vous ne faites pas l'assemblage AT & T pour la vie. Voir aussi la wiki tag pour plus de documents et guides .

Autres conseils

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 amont avec les assertions .

Le mnémonique est:

  • MOV
  • étendre zéro
  • octet (8 bits)
  • Long (32 bits)

Il existe aussi des versions pour d'autres tailles:

  • movzbw: octet (8 bits) de mot (16 bits)
  • movzwl: Word (16 bits) à Long (32 bits)

Comme la plupart des instructions de gaz, vous pouvez omettre la dernière taille de caractère lorsqu'ils traitent des registres:

movzb %bl, %eax

mais je ne comprends pas pourquoi nous ne pouvons pas omettre la dernière lettre avant, par exemple le défaut suivant:

movz %bl, %eax

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

Et si vous utilisez des registres de la mauvaise taille, il ne parvient pas à la compilation par exemple:.

movzb %ax, %eax
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top