Assembly di Linux Dengan GAS


Microsoft Macro Assembler (MASM) adalah salah satu assembler yang paling tua dan kini versinya sudah mencapai versi 10. Walaupun demikian, MASM bukanlah sebuah produk terpisah yang dapat di-download sendiri seperti zaman dulu.  Tidak ada link untuk download MASM.  Cara untuk mendapatkan MASM, misalnya, dengan meng-install Visual Studio 2010 yang sudah menyertakan assembler tersebut.

Bagaimana kalau seseorang hanya ingin sebuah assembler saja, sebuah produk yang berdiri sendiri, sebuah assembler modern, dan gratis?  Jawabannya terdapat dalam GNU Binary Utilities atau kerap disingkat binutils.  GNU Binary Utilities adalah kumpulan tools open source yang umumnya sudah ada dalam bawaan dalam distro populer Linux.  Informasi lengkap dapat dilihat di www.gnu.org/software/binutils.  Salah satu tools yang diserta oleh GNU Binary Utilities adalah sebuah assembler yang disebut GNU Assembler (atau disingkat GAS).  Keunikan GAS adalah sifat cross-platform-nya.  GAS mendukung banyak arsitektur komputer yang berbeda seperti Alpha, ARC, ARM, CRIS, D10V, D30V, H8/300, i386, i960, IA-64, IP2K, M32C, M32R, M680X0, M68HC11, PowerPC, SPARC, dan lainnya.

Walaupun gratis dan cross-platform, GAS memiliki sebuah permasalahan yang cukup mengganggu, terutama bagi mereka yang ingin menggunakan assembler tersebut di platform IA-32.  GAS menggunakan syntax AT&T sehingga programmer assembly yang terbiasa dengan MASM (sebagai informasi, MASM  memakai syntax Intel) harus menyesuaikan diri dan mempelajari syntax baru.  Selain itu, Intel menggunakan syntax Intel dalam dokumentasi prosesornya sehingga programmer GAS yang membaca dokumentasi Intel harus mereka-reka mnemonic yang ada bila harus ditulis dalam versi syntax AT&T.

Berikut ini adalah contoh skeleton sebuah program assembly untuk GAS:

.section .data
   ... (bagian data)

.section .bss
   ... (bagian block started by symbol)

.section .text
.globl _start
_start:
   ... (bagian kode program)

Sebagai contoh, di bawah ini adalah kode program GAS yang memanggil instruksi CPUID untuk mendapatkan informasi CPU.  Dengan memberikan nilai 0 pada register EAX sebelum memanggil CPUID, CPU manufacturer ID akan disimpan di register EBX, EDX, ECX (12 karakter).  Program kemudian akan mencetak CPU manufacturer ID tersebut.  Kemudian program akan mencetak processor brand string bila ada.  Program akan memanggil CPUID dengan nilai EAX = 0x80000000 dan memeriksa apakah nilai yang dikembalikan lebih besar dari 0x800000004.  Bila iya, terdapat processor brand string yang dapat dicetak dengan memanggil CPUID dimana nilai EAX=0x80000002, 0x80000003, dan 0x80000004 secara berurutan.

.section .data
output_vendor:
   .ascii    "Vendor ID Prosesor adalah 'xxxxxxxxxxxx'\n"
output_brand:
   .ascii    "Prosesor Brand String adalah 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n"
output_no_brand:
   .ascii  "Tidak ada informasi Processor Brand String\n"

.section .text
.globl _start
_start:
   movl $0, %eax
   cpuid
   movl $output_vendor, %edi
   movl %ebx, 27(%edi)
   movl %edx, 31(%edi)
   movl %ecx, 35(%edi)
   movl $4, %eax
   movl $1, %ebx
   movl $output_vendor, %ecx
   movl $41, %edx
   int $0x80

   movl $0x80000000, %eax
   cpuid
   cmpl $0x80000004, %eax
   jl no_brand

   movl $0x80000002, %eax
   cpuid
   movl $output_brand, %edi
   movl %eax, 30(%edi)
   movl %ebx, 34(%edi)
   movl %ecx, 38(%edi)
   movl %edx, 42(%edi)
   movl $0x80000003, %eax
   cpuid
   movl %eax, 46(%edi)
   movl %ebx, 50(%edi)
   movl %ecx, 54(%edi)
   movl %edx, 58(%edi)
   movl $0x80000004, %eax
   cpuid
   movl %eax, 62(%edi)
   movl %ebx, 66(%edi)
   movl %ecx, 70(%edi)
   movl %edx, 74(%edi)

   movb $0x20, 77(%edi)
   movl $4, %eax
   movl $1, %ebx
   movl $output_brand, %ecx
   movl $80, %edx
   int $0x80

   jmp selesai

no_brand:
   movl $4, %eax
   movl $1, %ebx
   movl $output_no_brand, %ecx
   movl $43, %edx
   int $0x80

selesai:
   movl $1, %eax
   movl $0, %ebx
   int $0x80

Program di atas menggunakan Linux system call (int $0x80) untuk mencetak ke layar konsole, yaitu write.  Di sistem operasi DOS & Windows.  Hal ini sama seperti memanggil interrupt 0x20 untuk mencetak di console.

Untuk menjalankan program di atas, berikan perintah seperti:

$ as -o cpuinfo.o cpuinfo.s
$ ld -o cpuinfo cpuinfo.o
$ ./cpuinfo
Vendor ID Prosesor adalah 'GenuineIntel'
Prosesor Brand String adalah 'Pentium(R) Dual-Core CPU       T4400  @ 2.20GHz '

Output dari program tersebut akan berbeda tergantung pada prosesor yang dipakai oleh pengguna.

Perihal Solid Snake
I'm nothing...

One Response to Assembly di Linux Dengan GAS

  1. Ping-balik: Memakai nasm Di Linux « The Solid Snake

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: