Search what you want

Wednesday, February 10, 2016

Assembly programming (get started) in linux [ubuntu]

        kalau kita mendengar bahasa pemrograman C, C++, Java, php, python dsb, mungkin kita familiar dengan bahasa tersebut. tetapi beda halnya dengan bahasa assembly, mungkin sebagian dari kita tau tetapi agak takut untuk mempelajarinya. kenapa? ya mungkin yang selama ini kita dengar bahwa bahasa itu sulit, ribet ngodingnya, panjang, ga jelas bahasanya dan berbagai alasan lainnya. di tambah lagi memang sih kalau kita langsung melakukan coding dengan bahasa tersebut untuk aplikasi yang lumayan besar dan compleks, akan kesulitan kitanya. 
          nah, tapi dalam beberapa penggunaan, mungkin bahasa ini memang cocok. contohnya untuk memanfaatkan resource yang sedikit di perangkat emmbedded, mungkin bahasa ini lebih cocok. Ditambah lagi bahasa ini memiliki performa kecepatan yang tinggi. mungkin kita bisa langsung saja, gimana sih ngoding assembly itu. untuk itu saya menggunakan perangkat berarsitektur x86 (32 bit).


Template codingan assembly:
;@author : Ardhi Maarik

section .data  ;data variable

section .bss  ;data reservation


section .text
 global main

main:

 ;exit
 mov eax, 1
 int 0x80
penjelasan: 
section .data -> digunakan untuk meletakkan variabel-variabel yang sudah memiliki nilai dan yang                               akan digunakan dalam program 
section .bss  -> digunakan untuk 'memesan' variabel yang tidak memiliki nilai. misalkan variabel                                   hasil
main:           -> digunakan untuk meletakan program utama yang akan dibuat.

untuk arsitektur 32bit terdapat 16 r3gister yang dapat kita akses. register-register tersebut memiliki fungsi-fungsi khusus tersendiri. untuk arsitektur 8bit, 16bit, 32bit memiliki arsitektur dan nama register yang berbeda-beda. Berikut merupakan perbedaannya:

32-bit
16-bit
8-bit (high)
8-bit (low)
EAX
AX
AH
AL
EBX
BX
BH
BL
ECX
CX
CH
CL
EDX
DX
DH
DL

                                   EAX (32 bit)
|================================|
                AX(16 bit)    |
|======== ========|
   AH(8bit) | AL (8bit)
|========|========|

Pada arsitektur 32 bit kita juga dapat mengakses register AX, AL, dan AH, sedangkan pada arsitektur 16 bit kita dapat mengakses register AL, AH. Jadi semagin besar arsitekturnya kita dapat mengakses register lebih leluasa.

sebelumnya, kita harus mengetahui 'tipe data' yang dapat digunakan dalam bahasa assembly.
(irvine dalam bukunya Assembly Language for x86 processor)

dengan cara penulisan syntax:

[LABEL:] MNEMONIC [OPERAND1], [OPERAND2], [OPERAND3]


berikut ini merupakan contoh codingan (Hello World!) menggunakan bahasa assembly:
;@author : Ardhi Maarik
;@task   : Print Hello World

section .data
 msg   db    'Hello World!',0xa, 0x0
 len   equ $-msg

section .bss

section .text
 global main

main:

 mov ecx, msg
 mov edx, len
 mov ebx, 1
 mov eax, 4
 int 0x80
 
 ;exit
 mov eax, 1
 int 0x80
penjelasan:
msg   db    'Hello World!',0xa, 0x0
membuat variabel 'msg' dengan tipe data 'db' (32bit integer) dengan value 'Hello World!', 0x2, 0x0.
0xa merupakan nilai ASCII untuk new line.
0x0 merupakan nilai ASCII untuk null.
setiap string harus diakhiri dengan null untuk menandakan string tersebut telah berakhir.
len   equ $-msg
membuat variabel 'len' dengan nilai panjang karakter dari value yang ada di variabel 'msg'.
pada assembly kita harus mendefinisikan panjang karakter yang akan kita print nantinya, maka dari itu untuk menampilkan keseluruhan dari string, kita harus mengetahui panjang dari string tersebut.
mov ecx, msg
memindahkan nilai dari variabel 'msg' ke register ecx
mov edx, len
memiindahkan nilai dari variabel 'len' ke register edx
mov ebx, 1
memiindahkan nilai 1 ke register ebx
mov eax, 4
memindahkan nilai 4 ke register eax
int 0x80
system call/call kernel


Sekarang kita mencoba untuk menjalankan progran tersebut.
1. buat folder baru. (misal orkom) folder ini saya buat di Desktop
2. copy dan paste code berikut, kemudian save as dengan nama Makefile ke forder orkom
#
exe= main
src= main.asm
assembler= yasm

#
obj= $(patsubst %.asm,%.o,$(src))

default: main

.PHONY: main   
main: $(obj)
 ld -o $(exe) -e main -m elf_i386 $(obj)

.PHONY: clean
clean:
 rm -f *.o *.lst $(exe) *~ .*.gdb

%.o: %.asm
 $(assembler) $*.asm -f elf32 -g dwarf2 -l $*.lst
code diatas kita gunakan untuk melakukan compile terhadap file .asm yang telah kita buat secara praktis.

3. save as program yang telah kita buat (Hello World) dengan nama main.asm di folder orkom
4. buka terminal di linux (Ctrl+Alt+t)
5. masuk ke folder orkom
cd Desktop/orkom
6. compile file main.asm
make
jika terdapat pesan diterminal seperti ini berarti file berhasil di compile
$ yasm main.asm -f elf32 -g dwarf2 -l main.lst
$ ld -o main -e main -m elf_i386 main.o
jika tidak, lihat dibaris mana progran error. (misal)
yasm main.asm -f elf32 -g dwarf2 -l main.lst
main.asm:16: error: instruction expected after label
make: *** [main.o] Error 1
terdapat 1 error yang berada di line ke 16

7. Jalankan program
./main
dengan hasil
Hello World!


~sekian~











No comments:

Post a Comment