Bahasa Pemrograman

Assembly

Jalur assembly x86-64 dan RISC-V dari register pertama sampai benchmark terhadap C, dengan setiap konsep diamati langsung di debugger dan perkakas analisis.

Jalur Assembly mengajarkan pemrograman tingkat mesin pada arsitektur x86-64 dan RISC-V secara langsung di terminal. Register, stack, dan konvensi pemanggilan tidak hanya dibahas secara konsep, melainkan diamati melalui gdb, objdump, dan strace pada program nyata. Materinya mencakup kedua sintaks utama, System V AMD64 ABI, SIMD hingga AVX2, system call Linux, ISA kedua RISC-V, dan benchmark terhadap C. Prasyarat lingkungannya berupa Linux x86-64 dengan NASM, GNU binutils, gdb, strace, dan gcc, serta qemu-riscv64 untuk modul RISC-V.

Mengenal Assembly 3 pelajaran

Modul pembuka: peran assembly dalam pekerjaan nyata, penyiapan toolchain, dan program pertama pada dua sintaks.

  1. Mengapa assembly pentingPeran assembly pada pekerjaan performa, debugging tingkat mesin, dan reverse engineering beserta batasannya.
  2. Penyiapan toolchainMemasang dan memeriksa NASM, GNU as, ld, dan gdb, lalu memverifikasi setiap perkakas dengan perintah versinya.
  3. Program pertama, dua sintaksProgram write dan exit pertama yang ditulis berdampingan pada sintaks Intel dengan NASM dan AT&T dengan GNU as.

Modul fondasi mesin: enam belas register serbaguna, bentuk operan MOV, LEA, dan pembaruan flag oleh aritmetika.

  1. Berkas register x86-64Enam belas register serbaguna 64-bit, ukuran 32/16/8-bit-nya, dan peran khusus rsp serta rbp.
  2. MOV dan bentuk operanTiga bentuk operan MOV, yaitu immediate, register, dan memori, beserta batasan ukurannya.
  3. LEA sebagai kalkulator alamatMekanisme alamat efektif basis ditambah indeks dikalikan skala ditambah displacement dan penggunaannya sebagai aritmetika.
  4. Aritmetika dan flagCara add, sub, dan cmp memperbarui ZF, CF, SF, dan OF beserta pembacaannya.
Alur kendali dan stack 4 pelajaran

Modul alur kendali: percabangan atas flag, perulangan manual, stack, serta pemanggilan dan pengembalian prosedur.

  1. Jump dan cabang bersyaratPercabangan berdasarkan kombinasi flag individual dengan je, jne, jl, dan sejenisnya.
  2. Perulangan secara manualPerulangan yang dibangun dari label, perbandingan, dan jump mundur tanpa instruksi loop.
  3. StackPerilaku push dan pop, pertumbuhan stack ke bawah melalui rsp, dan penyelarasan 16 byte pada titik masuk.
  4. call dan retAlamat kembali yang didorong call dan ditarik ret serta perpindahan kendali bersarang.
Fungsi dan ABI 5 pelajaran

Modul antarmuka fungsi: kontrak System V AMD64, pembagian register, stack frame, dan konvensi Microsoft x64.

  1. System V AMD64 ABIKontrak pemanggilan fungsi Linux: register argumen, balikan, register yang dipertahankan, dan stack.
  2. Register argumen dan balikanrdi, rsi, rdx, rcx, r8, dan r9 untuk enam argumen pertama serta rax sebagai register balikan.
  3. Register caller-saved dan callee-savedRegister mana yang bertahan melewati sebuah call dan mana yang harus diselamatkan sebelum ditimpa.
  4. Stack frame dan penyelarasanProlog dan epilog berbasis rbp, penyelarasan stack 16 byte sebelum call, dan akibat melanggarnya.
  5. Konvensi Microsoft x64Perbedaan Windows: rcx, rdx, r8, dan r9 untuk argumen, shadow space 32 byte, dan tanpa red zone.

Modul memori: mode pengalamatan lengkap, direktif data, array dengan aritmetika pointer, dan tata letak struct.

  1. Mode pengalamatanPola pengalamatan basis ditambah indeks dikalikan skala ditambah displacement pada bentuknya yang lengkap.
  2. Direktif dataDefinisi data dengan db, dw, dd, dan dq, pemesanan ruang dengan times dan resb, serta konstanta equ.
  3. Array dan aritmetika pointerPenelusuran array menggunakan pengalamatan indeks berskala dan perhitungan offset elemennya.
  4. Struct, offset, dan penyelarasanTata letak field struct, padding penyelarasan, dan akses field secara manual dengan offset tetap.
Section dan penautan 4 pelajaran

Modul organisasi program: semantik section, simbol dan relokasi, pengalamatan relatif RIP, dan penautan dengan ld.

  1. Section programSemantik .text, .data, .rodata, dan .bss beserta izin baca-tulis-eksekusi yang menyertai masing-masing.
  2. Simbol dan relokasiLabel lokal dan global, tabel simbol, dan relokasi yang diselesaikan lintas berkas objek.
  3. Pengalamatan relatif RIPReferensi data relatif terhadap RIP sebagai dasar kode bebas posisi dan persamaannya dengan label.
  4. Penautan dengan ldBerkas objek, titik masuk _start, penautan beberapa berkas, dan executable statik yang dihasilkan.
SIMD 5 pelajaran

Modul SIMD: register xmm dan ymm, aritmetika SSE hingga AVX2, serta penyelarasan datanya, semuanya terukur.

  1. Register xmm dan instruksi moveRegister xmm 128-bit dengan lane internalnya serta pasangan movaps dan movups.
  2. Aritmetika SSEOperasi packed integer dan floating point untuk empat nilai sekaligus pada register xmm.
  3. Bentuk tiga operan AVXPrefiks v dan encoding tiga operan non-destruktif AVX yang memisahkan sumber dan tujuan.
  4. AVX2 dan register ymmRegister ymm 256-bit, operasi delapan lane, dan instruksi gather untuk pengumpulan data tak berurutan.
  5. Penyelarasan dan akses tak selarasFault akses tak selaras, arahan penyelarasan data, dan pertimbangan memilih movups.
System call dan I/O 4 pelajaran

Modul antarmuka kernel: nomor syscall dan register argumennya, file descriptor, error mentah, dan buffer input.

  1. Antarmuka syscall LinuxNomor syscall pada rax, argumen pada register, instruksi syscall, dan daftar rujukannya.
  2. Dasar file descriptoropen, read, write, dan close pada level mentah beserta nilai balik descriptor-nya.
  3. Error syscall mentahKode errno negatif yang dikembalikan dalam rax dan cara membedakannya dari nilai balik normal.
  4. Membangun input dengan bufferBuffer baca yang dapat digunakan kembali di atas syscall mentah sampai data terbaca penuh.
RISC-V RV64GC 5 pelajaran

Modul ISA kedua: filosofi RISC-V, register dan encoding, pola load-store, cabang tanpa flag, dan ABI-nya.

  1. Filosofi RISC-VISA terbuka dengan ekstensi modular dan desain basis minimal RV64I beserta implikasinya.
  2. Register dan format RV64x0 hingga x31 beserta enam format encoding R, I, S, B, U, dan J.
  3. Aritmetika load-storePola aritmetika hanya antar register dan akses memori hanya melalui load dan store.
  4. Cabang tanpa flagPasangan compare-and-branch yang membandingkan langsung tanpa register flag, beserta pseudo-instruksinya.
  5. ABI RISC-VArgumen a0 hingga a7, alamat kembali ra, pointer stack sp, dan disiplin callee-saved-nya.
Perkakas dan analisis 4 pelajaran

Modul analisis: membaca keluaran assembler dan compiler, menelusuri program di gdb dan strace, serta inline assembly.

  1. objdump dan Compiler ExplorerMembaca keluaran assembler dan compiler nyata melalui objdump lokal dan Compiler Explorer daring.
  2. gdb pada assemblyBreakpoint pada label, inspeksi register dan memori, serta langkah per instruksi di gdb.
  3. Visibilitas straceMenelusuri setiap syscall yang dijalankan sebuah executable beserta argumen dan nilai baliknya.
  4. Inline assembly dalam CGCC extended asm dengan templat, constraint, dan clobber untuk menyisipkan assembly dalam C.
Pengerjaan proyek 2 pelajaran

Modul penutup: memilih target optimasi yang realistis dan membandingkannya dengan C secara terukur dan jujur.

  1. Pemilihan targetKriteria memilih target di antara hashing, parsing, dan rutin penyalinan serta definisi keberhasilannya.
  2. Benchmark terhadap CMetodologi benchmark yang adil terhadap C yang dioptimalkan dan pelaporan hasilnya secara jujur.