Hal-hal aneh yang dipelajari saat menulis emulator x86
- Menjelaskan berbagai trivia dan keanehan yang dipelajari saat menulis emulator x86 dan amd64
- Dalam Time Travel Debugging(TTD), emulator CPU digunakan untuk merekam eksekusi proses pada level instruksi
- Versi pertama TTD disebut iDNA, ditulis dalam assembly, cepat tetapi sulit dirawat
- Versi kedua ditulis dalam C++, sehingga kemudahan pemeliharaannya meningkat
Trivia encoding x86 yang tidak berguna
- Skema encoding x86 memungkinkan instruksi yang sama di-encode dengan berbagai cara
- Instruksi
int 3 dapat di-encode sebagai CD 03 atau CC
- Register
EAX disebut "register akumulator", dan memang memiliki perbedaan dalam encoding
- Prefiks
REX memungkinkan akses ke rentang register yang lebih luas dalam kode 64-bit
- Panjang instruksi bisa mencapai maksimum 15 byte, dan jika melebihinya akan terjadi exception
- Prefiks address override memungkinkan referensi alamat 32-bit dalam mode 64-bit
Karakteristik flag yang aneh
- Instruksi
INC tidak memperbarui carry flag, berbeda dengan instruksi ADD
- Instruksi
CMPXCHG8B/CMPXCHG16B hanya memodifikasi zero flag
- Instruksi shift dan rotate membiarkan overflow flag dalam keadaan tidak terdefinisi bila jumlah shift lebih besar dari 1
Lebih banyak kejutan dari instruksi shift
shr ax, 10h menggeser register ax sejauh 16 bit sehingga menjadi 0
shr eax, 20h menggeser register eax sejauh 32 bit tetapi nilainya tidak berubah
- Jumlah shift dimasking dengan 1FH
Segment override
- Segmen masih digunakan dalam kode 32-bit dan 64-bit, terutama untuk thread-local storage
- Di Windows, register
FS atau GS digunakan untuk mereferensikan TEB(Thread Execution Block)
- Pada proses 32-bit digunakan
FS, dan pada proses 64-bit digunakan GS
- Dalam mode 64-bit, nilai register segmen tidak penting
Segment override: lebih banyak trivia
- Dalam mode 32-bit, nilai aktual register segmen mereferensikan segment descriptor
- Dalam mode 64-bit, base dikendalikan oleh MSR
- Di WinDbg, nilai segmen proses 64-bit tidak bisa dibaca secara langsung
Kesimpulan
- Artikel ini memberikan daftar acak trivia x86
- Menulis emulator membantu memahami secara mendalam bagaimana CPU bekerja
- Sumber daya yang sangat bagus dapat ditemukan di situs web Agner Fog
Ringkasan GN⁺
- Menjelaskan berbagai trivia dan keanehan yang dipelajari saat menulis emulator x86 dan amd64
- Menulis emulator membantu memahami secara mendalam cara kerja CPU
- Membahas berbagai trivia seperti beragam cara encoding instruksi
int 3, prefiks REX, dan segment override
- Lebih banyak sumber daya tersedia di situs web Agner Fog
1 komentar
Komentar Hacker News