Wat doet deze instructie precies?
movzbl 0x01(%eax,%ecx), %eax
Antwoord 1, autoriteit 100%
AT&T-syntaxis splitst het movzx
Intel-instructiegeheugenin verschillende geheugensteuntjes voor verschillende brongroottes (movzb
vs. 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 -Mintel
of 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 mov
en Intel Syntaxis?
En als u registers van de verkeerde maat gebruikt, maakt het niet om bijvoorbeeld te compileren.:
movzb %ax, %eax