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: AT&T Syntax, CPUID, GAS.
1 Komentar Add your own
Tinggalkan Balasan
Trackback this post | Subscribe to the comments via RSS Feed
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 [...]