Ensiklopedia Assembly Directives: Panduan Lengkap untuk NASM

Directives adalah instruksi khusus yang tidak diterjemahkan menjadi kode mesin oleh CPU, melainkan perintah yang mengatur perilaku Assembler saat menyusun file binari. Berikut adalah klasifikasi lengkapnya:


1. Direktif Inisialisasi Data (Initialized Data)

Digunakan untuk menyimpan nilai konstan atau variabel awal di dalam file binari.

DirektifNama LengkapUkuran
DBDefine Byte1 Byte (8-bit)
DWDefine Word2 Byte (16-bit)
DDDefine Doubleword4 Byte (32-bit)
DQDefine Quadword8 Byte (64-bit)
DTDefine Ten Bytes10 Byte (80-bit)
DODefine Octoword16 Byte (128-bit)
DYDefine Y-word32 Byte (256-bit)
DZDefine Z-word64 Byte (512-bit)

2. Direktif Reservasi Data (Uninitialized Data)

Digunakan untuk memesan ruang di memori (RAM) tanpa mengisi nilainya di dalam file binari. Ini sangat menghemat ukuran file karena file tidak perlu menyimpan ribuan angka nol.

  • RESB, RESW, RESD, RESQ, REST, RESO, RESY, RESZ: Memiliki aturan ukuran yang sama dengan tabel di atas, namun hanya memesan tempat (biasanya digunakan di section .bss).

3. Direktif Kontrol Lokasi dan Penyelarasan (Alignment)

Sangat penting untuk optimasi performa CPU agar data selaras dengan batas memori tertentu.

  • ALIGN: Menyelaraskan kode atau data ke batas byte tertentu (misal: ALIGN 4). CPU membaca data lebih cepat jika alamatnya kelipatan 4 atau 16.
  • ALIGNB: Variasi dari ALIGN yang digunakan khusus di bagian memori yang dipesan (BSS).
  • [ORG]: Menentukan alamat asal (Origin) tempat kode akan dimuat di RAM.
  • [BITS]: Menentukan mode bit prosesor (16, 32, atau 64 bit).

4. Direktif Pre-processor (Makro)

Pesan ini dimulai dengan tanda persen (%) dan diproses sebelum proses assembling dimulai. Ini membuat kode Assembly Anda terasa seperti bahasa tingkat tinggi.

  • %define: Membuat konstanta atau makro satu baris (seperti #define di C).
  • %macro / %endmacro: Membuat blok kode yang bisa dipanggil berulang kali dengan parameter berbeda.
  • %include: Mengimpor file eksternal ke dalam kode utama.
  • %assign: Mirip dengan %define tetapi khusus untuk nilai numerik yang bisa diubah-ubah.
  • %ifdef / %ifndef / %endif: Kondisional untuk menentukan apakah suatu bagian kode harus dikompilasi atau tidak.

5. Direktif Manajemen Simbol dan Linker

Digunakan saat Anda bekerja dengan banyak file atau menggabungkan Assembly dengan bahasa C.

  • GLOBAL: Membuat sebuah label dapat diakses oleh file lain (mengekspor).
  • EXTERN: Memberi tahu Assembler bahwa label tersebut didefinisikan di file lain (mengimpor).
  • COMMON: Mendeklarasikan variabel bersama yang bisa diakses oleh banyak modul.
  • CPU: Membatasi instruksi hanya untuk model CPU tertentu (misal: CPU 8086).

6. Direktif Struktur Data (Struc)

Meskipun Assembly adalah bahasa tingkat rendah, NASM mendukung pembuatan struktur data yang mirip dengan struct pada bahasa C.

  • STRUC / ENDSTRUC: Mendefinisikan kerangka struktur data.
  • ISTRUC / AT / IEND: Mengisi data ke dalam struktur yang sudah didefinisikan.

7. Direktif Khusus Output Format

Tergantung pada apakah Anda membuat file .bin (untuk bootloader) atau .obj (untuk Windows/Linux).

  • SECTION / SEGMENT: Membagi kode menjadi bagian .text (instruksi), .data (variabel awal), dan .bss (variabel kosong).
  • ABSOLUTE: Memungkinkan Anda mendefinisikan label pada alamat memori absolut tanpa memakan ruang di file binari.

Kesimpulan

Daftar di atas mencakup hampir seluruh fungsionalitas direktif pada NASM modern. Untuk proyek Raspberry Pi atau x86 OS yang sedang kita kembangkan, direktif seperti [BITS], [ORG], TIMES, dan DB/DW adalah yang paling vital. Namun, seiring berkembangnya sistem operasi kita nanti, direktif makro (%macro) dan manajemen seksi (SECTION) akan menjadi kunci utama dalam menjaga kerapihan kode.