Assembly di Linux Dengan GAS

30 Oktober 2011 at 3:33 PM 1 komentar

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 = 0×80000000 dan memeriksa apakah nilai yang dikembalikan lebih besar dari 0×800000004.  Bila iya, terdapat processor brand string yang dapat dicetak dengan memanggil CPUID dimana nilai EAX=0×80000002, 0×80000003, dan 0×80000004 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 $0×80) untuk mencetak ke layar konsole, yaitu write.  Di sistem operasi DOS & Windows.  Hal ini sama seperti memanggil interrupt 0×20 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.

Entry filed under: Assembly, Computer Hardware. Tags: , , .

I/O Programming: Mengatur Lampu LED di Keyboard Membuat Album Foto Dengan PrimeFace Di NetBeans 7

1 Komentar Add your own

  • 1. Memakai nasm Di Linux « The Solid Snake  |  02 November 2011 pada 5:41 PM

    [...] tulisan sebelumnya yang berjudul Assembly di Linux Dengan GAS  , saya memperlihatkan penggunaan GNU Assembler di Linux.  GNU Assembler (GAS) hampir tersedia di [...]

    Balas

Tinggalkan Balasan

Fill in your details below or click an icon to log in:

WordPress.com Logo

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

Twitter picture

You are commenting using your Twitter account. Log Out / Ubah )

Facebook photo

You are commenting using your Facebook account. Log Out / Ubah )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Arsip


Ikuti

Get every new post delivered to your Inbox.