Zero-extension ja REX-prefix
Zero-extension ja REX-prefix
x86-64 lisäsi kaksi merkittävää muutosta vanhaan x86:een:
- Uudet rekisterit:
R8..R15. Lisää tilaa argumenteille, paikallisille muuttujille ja optimoinneille. - 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:
| Bitti | Tarkoitus |
|---|---|
W | 64-bittinen operandi (asetettuna). Ilman tätä operaatio on 32-bittinen vaikka kohderekisteri olisi RAX. |
R | Laajenna ModR/M-osan reg-kentää (R8..R15). |
X | Laajenna SIB-indeksiä. |
B | Laajenna 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ä.
1mov rax, 0xDEADBEEFCAFEBABE
2mov eax, 1 ; nyt RAX = 0x00000000_00000001 (ei 0xDEADBEEF_00000001)Tämä on eri 8- ja 16-bittisille kirjoituksille:
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_CAFEBA01Miksi 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.
Tästä kannattaa muistaa
| Kirjoitus | Vaikutus täyteen rekisteriin |
|---|---|
mov rax, X (REX.W) | RAX = X |
mov eax, X | RAX = zero-extended X (ylimmät 32 bittiä = 0) |
mov ax, X | RAX = (RAX & ~0xFFFF) |
mov al, X | RAX = (RAX & ~0xFF) |
mov ah, X | RAX = (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.
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.