Que fait L'instruction MOVZBL dans la syntaxe IA-32 AT&T?
qu'est-Ce exactement l'instruction
movzbl 0x01(%eax,%ecx),%eax
fait?
2 réponses
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 x86 pour plus de docs et de guides.
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 .