Belajar Assembly - Arsitektur CPU & Konsep Dasar
Episode 2 of 23

Belajar Assembly - Arsitektur CPU & Konsep Dasar

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.

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

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.

Tiga Keluarga Arsitektur Besar

x86-64: Raja Desktop dan Server

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: Raksasa Mobile dan Efisiensi

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: ISA Open-Source

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.

Aspekx86-64ARM64RISC-V
KeluargaCISCRISCRISC (open)
Panjang instruksi1–15 byteFixed 32-bit32-bit (atau 16-bit compressed)
Akses memoriLangsung dalam instruksiLoad-store sajaLoad-store saja
Register umumraxr15 (16)x0x30 (31)x0x31 (32)
DomainDesktop, serverMobile, laptop, serverEmbedded, 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.

Program Counter: Denyut Jantung Eksekusi

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.

100%

Arsitektur Von Neumann: Satu Memori untuk Semua

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:

  • Kalian bisa membaca program sebagai data — inilah dasar disassembler (objdump) dan self-modifying code.
  • Buffer overflow bisa menimpa instruksi dengan data — inilah akar banyak exploit (episode 17).
  • Tidak ada cara "sakral" membedakan kode dan data di level byte; hanya tabel symbol dan kesepakatan yang melakukannya.

Register: Ruang Kerja CPU

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.

KategoriRegister x86-64Fungsi
General-purposerax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, r8r15Operasi umum
Pointer khususrip (instruction pointer), rsp (stack pointer)Eksekusi & stack
FlagsrflagsStatus 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: Struktur yang Tumbuh ke Bawah

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.

plaintext
Alamat tinggi  |  |      |  |
               |  | data |  |  <- frame fungsi lama
               |  | data |  |  <- frame fungsi baru (RBP)
               |  +------+  |
RSP -->        |  |      |  |  <- stack "bawah" (tumbuh ke sini)
Alamat rendah

Endianness: Urutan Byte di Memori

Ketika nilai 64-bit 0x1122334455667788 disimpan ke memori, bagaimana urutan byte-nya? Ini ditentukan oleh endianness arsitektur:

  • Little-endian (x86-64, ARM64 default): byte paling rendah disimpan di alamat terkecil. 0x88 dulu, baru 0x77, dst.
  • Big-endian (beberapa ISA, jaringan): byte paling tinggi dulu.
Byte 0x1122334455667788 di memori (little-endian)
; alamat:   0x100  0x101  0x102  0x103  ...  0x107
; isi:      0x88   0x77   0x66   0x55   ...  0x11

Mengapa 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.

Penutup

Pada episode 2 ini, kalian telah membangun fondasi pemahaman tentang mesin yang akan kalian program.

Inti yang harus dibawa pulang:

  • Tiga arsitektur besar: x86-64 (CISC, variabel-length), ARM64 (RISC, fixed 32-bit, load-store), RISC-V (open-source).
  • RIP/PC menunjuk instruksi berikutnya dan maju otomatis; jmp/call mengubahnya.
  • Von Neumann: data dan instruksi di memori yang sama — akar banyak fenomena, dari disassembler hingga exploit.
  • Register adalah "meja kerja" CPU; stack tumbuh ke bawah dan dikelola RSP.
  • Little-endian menyimpan byte terendah di alamat terendah — baca memori dengan hati-hati.

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!