Wat doet de MOVZBL-instructie in de IA-32 AT&T-syntaxis?

Wat doet deze instructie precies?

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

Antwoord 1, autoriteit 100%

AT&T-syntaxis splitst het movzxIntel-instructiegeheugenin verschillende geheugensteuntjes voor verschillende brongroottes (movzbvs. movzw). In Intel-syntaxis is het:

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

d.w.z. laad een byte uit het geheugen op eax+ecx+1 en zero-extend naar volledig register.

BTW, de meeste GNU-tools hebben nu een schakelaar of een configuratieoptie die de voorkeur geeft aan Intel-syntaxis. (Zoals objdump -Mintelof gcc -S -masm=intel, hoewel de laatste invloed heeft op de syntaxis die wordt gebruikt bij het compileren van inline-asm). Ik zou zeker aanraden om er naar te kijken, als je niet aan AT&T-assemblage doet om te leven. Zie ook de x86tag-wiki voor meer documenten en handleidingen .


Antwoord 2, autoriteit 58%

Minimaal voorbeeld

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 stroomopwaarts met beweringen.

Het geheugensteuntje is:

  • MOV
  • Nul verlengen
  • Byte (8-bits)
  • naar lang (32-bit)

Er zijn ook versies voor andere maten:

  • movzbw: Byte (8-bit) naar Word (16-bit)
  • movzwl: woord (16-bits) naar lang (32-bits)

Zoals de meeste gasinstructies, kunt u het karakter van het laatste formaat weglaten bij het omgaan met registers:

movzb %bl, %eax

Maar ik kan niet begrijpen waarom we de laatste letter niet kunnen weglaten, b.v. de volgende mislukt:

movz %bl, %eax

Waarom niet alleen afleiden van de grootte van de operanden wanneer ze registers zijn als voor moven Intel Syntaxis?

En als u registers van de verkeerde maat gebruikt, maakt het niet om bijvoorbeeld te compileren.:

movzb %ax, %eax

Other episodes