HAKATEMIA
26x86-64 ABI ja kutsutavat

Zero-extension ja REX-prefix

Keskitaso25MIN

Zero-extension ja REX-prefix

x86-64 lisäsi kaksi merkittävää muutosta vanhaan x86:een:

  1. Uudet rekisterit: R8..R15. Lisää tilaa argumenteille, paikallisille muuttujille ja optimoinneille.
  2. REX-prefiksi: 1 tavun prefix-bitti, joka tekee normaaleista käskyistä 64-bittisiä, koodaa uudet rekisterit, tai laajentaa SIB-osoituksen.

REX:ssä on neljä bittiä, jotka on hyvä tunnistaa:

BittiTarkoitus
W64-bittinen operandi (asetettuna). Ilman tätä operaatio on 32-bittinen vaikka kohderekisteri olisi RAX.
RLaajenna ModR/M-osan reg-kentää (R8..R15).
XLaajenna SIB-indeksiä.
BLaajenna ModR/M-osan r/m-kenttää / opcode-rekisteriä.

objdump -d näyttää REX:n raw-tavuna jokaisen käskyn alussa: 48 89 c3 (mov rbx, rax): 0x48 on REX.W, 89 on mov-opcode.

Zero-extension: varoitus

Tämä on x86-64:n pahin gotcha. Kun kirjoitat 32-bittiseen rekisteriin (eax, ebx, ecx, ...), CPU NOLLAA AINA ylemmät 32 bittiä.

X86
1mov     rax, 0xDEADBEEFCAFEBABE
2mov     eax, 1                  ; nyt RAX = 0x00000000_00000001 (ei 0xDEADBEEF_00000001)

Tämä on eri 8- ja 16-bittisille kirjoituksille:

X86
1mov     rax, 0xDEADBEEFCAFEBABE
2mov     ax,  1                  ; RAX = 0xDEADBEEF_CAFE0001 (ax = AL:n + AH:n yhdistelmä, ylemmät 48 säilyvät)
3mov     al,  1                  ; RAX = 0xDEADBEEF_CAFEBA01

Miksi näin? Suorituskykyä varten. Jos jokainen 32-bittinen kirjoitus säilyttäisi 32 ylintä bittiä, RAX:n koko 64-bittinen pakkaus olisi tieto-riippuvuus joka ketjuttaa jokaisen 32-bittisen käskyn aiempiin. Pyyhkimällä CPU katkaisee ketjun ja saa OoO-suoritus enemmän rinnakkaisuutta.

TERMINALASCIINEMA

Tästä kannattaa muistaa

KirjoitusVaikutus täyteen rekisteriin
mov rax, X (REX.W)RAX = X
mov eax, XRAX = zero-extended X (ylimmät 32 bittiä = 0)
mov ax, XRAX = (RAX & ~0xFFFF)
mov al, XRAX = (RAX & ~0xFF)
mov ah, XRAX = (RAX & ~0xFF00)

Sama pätee ADD/SUB/XOR/AND/OR-perheelle: 32-bittinen operaatio NOLLAA ylimmät 32 bittiä.

xor eax, eax on x86-64:n nopein tapa nollata koko RAX: kompakti 2-tavuinen koodaus ja zero-extension nollaa ylimmät 32 bittiä siinä samalla.

1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.