Membedah arsitektur CPU modern dari sudut pandang assembly: perbandingan x86-64 (CISC) vs ARM64 (RISC) vs RISC-V, peran register dan Program Counter (RIP/PC), cara kerja stack (push/pop, RSP), arsitektur Von Neumann di mana data dan instruksi tinggal satu memori, serta konsep endianness yang menentukan urutan byte di RAM.

Setelah di episode 1 kita memahami sejarah dan alasan mempelajari assembly, sekarang kita membedah mesinnya: seperti apa arsitektur CPU yang akan kalian program? Episode 2 adalah fondasi mental sebelum kalian menulis kode. Semua konsep di sini — register, program counter, stack, endianness — akan muncul di hampir setiap episode berikutnya, jadi pastikan pemahamannya benar-benar mengendap.
Bayangkan kalian pindah ke negara baru: sebelum bisa bicara, kalian harus paham dulu siapa yang jadi kepala keluarga (register utama), bagaimana alamat rumah bekerja (addressing), dan aturan tidak tertulis soal antrean (stack). Itulah yang kita bangun di episode ini — kamus awal untuk memahami mesin kalian.
x86-64 (juga disebut AMD64) adalah ekstensi 64-bit dari x86 yang dikembangkan AMD lalu diadopsi Intel. Ia adalah arsitektur CISC (Complex Instruction Set Computer): instruksinya beragam, panjangnya variabel (1 sampai 15 byte), dan bisa mengakses memori langsung dalam satu instruksi.
Keunggulannya: ekosistem perangkat lunak terbesar di dunia dan backward-compatibility — program yang ditulis untuk 8086 tahun 1978 masih bisa dijalankan. Kelemahannya: instruksi panjang bervariasi menyulitkan pipeline, dan decoding menjadi kompleks. Register general-purpose-nya bernama rax, rbx, rcx, dst.
ARM64 (aarch64) adalah arsitektur RISC (Reduced Instruction Set Computer). Semua instruksinya berukuran tetap 32-bit, dan arsitekturnya menerapkan model load-store: hanya instruksi ldr/str yang menyentuh memori, operasi lain bekerja murni di register.
Keunggulannya: decoding sederhana, konsumsi daya rendah, dan efisiensi luar biasa — itulah mengapa ia mendominasi smartphone dan kini masuk ke laptop (Apple Silicon, Windows on ARM) dan server (AWS Graviton). Register general-purpose-nya bernama x0 sampai x30.
RISC-V adalah ISA RISC yang dirilis open-source — siapa pun bisa membuat CPU berbasis RISC-V tanpa lisensi. Arsitekturnya modular: RISC-V "bare" hanya punya 47 instruksi dasar (RV32I/RV64I), dan kalian menambahkan ekstensi sesuai kebutuhan (M untuk multiply, F/D untuk floating point, C untuk compressed). Ini adalah masa depan embedded dan chip custom.
| Aspek | x86-64 | ARM64 | RISC-V |
|---|---|---|---|
| Keluarga | CISC | RISC | RISC (open) |
| Panjang instruksi | 1–15 byte | Fixed 32-bit | 32-bit (atau 16-bit compressed) |
| Akses memori | Langsung dalam instruksi | Load-store saja | Load-store saja |
| Register umum | rax–r15 (16) | x0–x30 (31) | x0–x31 (32) |
| Domain | Desktop, server | Mobile, laptop, server | Embedded, chip custom |
Note
Series ini berfokus pada x86-64 untuk episode 3–14 dan 16–21, lalu mengalihkan perhatian ke ARM64 di episode 15. Konsep yang kalian pelajari di x86-64 (register, stack, calling convention) 80% berlaku juga di ARM64 — hanya namanya yang berubah.
Setiap CPU punya register khusus bernama Program Counter (PC) yang menyimpan alamat instruksi yang sedang (akan) dieksekusi. Di x86-64 ia bernama RIP (Instruction Pointer), di ARM64 dan RISC-V ia bernama PC.
Alur kerjanya sederhana: CPU membaca instruksi di alamat yang ditunjuk RIP, mengeksekusinya, lalu otomatis memajukan RIP sepanjang instruksi tersebut. Untuk jmp dan call (episode 6 dan 8), RIP diubah secara eksplisit — itulah cara komputer mengambil keputusan dan memanggil fungsi.
Pada 1945, John von Neumann mempublikasikan desain yang menjadi dasar hampir semua komputer modern: data dan instruksi tinggal di memori yang sama, dibedakan hanya oleh bagaimana CPU menggunakannya. Artinya, byte 0x48 bisa menjadi bagian dari instruksi atau bagian dari string, tergantung konteksnya.
Dampak praktisnya bagi programmer assembly:
objdump) dan self-modifying code.Register adalah penyimpanan paling cepat di CPU — berukuran 64-bit di arsitektur modern. Inilah "meja kerja" programmer assembly: semua operasi CPU pada dasarnya bekerja pada register atau memori.
| Kategori | Register x86-64 | Fungsi |
|---|---|---|
| General-purpose | rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, r8–r15 | Operasi umum |
| Pointer khusus | rip (instruction pointer), rsp (stack pointer) | Eksekusi & stack |
| Flags | rflags | Status hasil operasi (ZF, CF, SF, OF...) |
Register x86-64 punya "sub-register": eax adalah 32-bit bawah dari rax, ax adalah 16-bit bawah, dan al/ah masing-masing byte rendah/tinggi dari ax. Kita bedah lengkap di episode 5.
Stack adalah wilayah memori khusus yang dikelola lewat register RSP (Stack Pointer). Aturannya: stack tumbuh ke bawah (ke alamat lebih rendah), dan operasinya adalah LIFO (Last-In, First-Out).
push rax → RSP dikurangi 8, lalu nilai rax disimpan di alamat baru RSP.pop rax → nilai di alamat RSP dimuat ke rax, lalu RSP ditambah 8.Kegunaannya: menyimpan alamat kembali saat call, tempat variabel lokal fungsi, dan area untuk passing argument (episode 8–9). Analogi terbaik: tumpukan piring di restoran — piring terakhir yang diletakkan adalah yang pertama diambil.
Alamat tinggi | | | |
| | data | | <- frame fungsi lama
| | data | | <- frame fungsi baru (RBP)
| +------+ |
RSP --> | | | | <- stack "bawah" (tumbuh ke sini)
Alamat rendahKetika nilai 64-bit 0x1122334455667788 disimpan ke memori, bagaimana urutan byte-nya? Ini ditentukan oleh endianness arsitektur:
0x88 dulu, baru 0x77, dst.; alamat: 0x100 0x101 0x102 0x103 ... 0x107
; isi: 0x88 0x77 0x66 0x55 ... 0x11Mengapa ini penting? Saat kalian membaca memori mentah dengan gdb (x/8bx), angka yang tampak "terbalik" bukanlah bug — itu little-endian. Dan saat membaca protocol network yang big-endian, kalian harus membalik byte dengan bswap. Ini keterampilan yang akan kalian pakai di episode 16 (debugging) dan 11 (data structures).
Tip
Aturan praktis: selama kalian selalu mengakses data dengan lebar yang sama saat menulis dan membaca, endianness tidak akan terasa. Masalah muncul saat kalian membaca satu register dengan dua lebar berbeda, misalnya menulis 32-bit mov eax, 0x11223344 lalu membaca ax → hasilnya 0x3344, bukan 0x1122.
Pada episode 2 ini, kalian telah membangun fondasi pemahaman tentang mesin yang akan kalian program.
Inti yang harus dibawa pulang:
jmp/call mengubahnya.Di episode 3 selanjutnya, saatnya hands-on pertama: kita install NASM bila belum, menulis Hello World Linux x86-64 dengan syscall write, lalu assemble dengan nasm -f elf64 dan link dengan ld — momen di mana semua konsep tadi mulai terasa nyata. Pastikan environment episode 0 sudah siap!