Search what you want

Labels

Showing posts with label Assembly. Show all posts
Showing posts with label Assembly. Show all posts

Wednesday, February 10, 2016

Debug Assembly Code with gdb

Sering kali dari kita, ketika kitaa menuliskan code program tidak selalu langsung berhasil pada percobaan compile pertama kali. Hasil dari program yang kita tuliskan biasanya mengeluarkan hasil output yang berbeda dari harapan kita. banyak alasan yang menyebabkan output tersebut belum benar. mungkin dikarenakan logika program yang salah, melakukan proses aritmatika yang salah, hinggapendefinisian variabel yang salah. Hal-hal tersebut haruslah kita tangani untuk mendapatkan hasil seperti yang kita harapkan. yap. Debuging merupakan langkah yang harus kita lakukan terhadap program yang kita tulis. Terdapat fasilitas yang telas disediakan untuk mellakukan debug pada program assembly yaitu GDB. Pada kesempatan ini kita akakn mencoba melakukan debug pada program. "Get started program assembly" dapat dilihat di postingan sebelumnya. langsung aja kita buat program yang akan kita debug nantinya.

1. buat progran main.asm dan letakkan pada folder orkom (Get started program assembly)
;@author : Ardhi Maarik
;@task : Debuding
section .data ;data variable
a dd 4 b dd 1 section .bss ;data reservation result resd 1 section .text global main main: mov eax, 1 mov ebx, 4 mov ecx, eax mov eax, [a] mov ebx, [b] mov dword[result], eax ;exit mov eax, 1 int 0x80
2. buka terminal dan masuk ke folder orkom
cd Desktop/orkom
3. compile file
make
text keluaran dari terminal:
yasm main.asm -f elf32 -g dwarf2 -l main.lst
ld -o main -e main -m elf_i386 main.o
4. lakukan debuging
gdb main
text keluaran dari terminal: (tidak harus sama persis seperti ini)
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from main...done.
(gdb) 

5. break file, mulai dari fungsi main
break main
text keluaran dari terminal:
Breakpoint 1 at 0x8048080: file main.asm, line 17.
penjelasan: program main pertama ada di line ke 17

6. run program
run
text keluaran dari terminal:
Starting program: /home/username/Desktop/orkom/main 

Breakpoint 1, main () at main.asm:17
17  mov eax, 1
7. Melihat register yang digunakan 
info register
text keluaran dari terminal
eax            0x0 0
ecx            0x0 0
edx            0x0 0
ebx            0x0 0
esp            0xffffcc60 0xffffcc60
ebp            0x0 0x0
esi            0x0 0
edi            0x0 0
eip            0x8048080 0x8048080 <main>
eflags         0x202 [ IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0 0
gs             0x0 0
8. Display nilai dari suatu register untuk mendebug
display $eax
display $ebx
display $ecx
display a
display b
display result
untuk menampilkan register tertentu, karena register yang kita gunakan yaiut eax, ebx, ecx dan variabel a, b, result. untuk menampilkan register harus diawali oleh $<register>, sedangkan untuk variabel tidak.

nilai awal dari setaip register masih nol dan nilai awal dari variabel sudah ada kecuali variabel result
1: $eax = 0
2: $ebx = 0
3: $ecx = 0
4: a = 4
5: b = 1
6: result = 0
9. jalankan program ke line selanjutnya
ni
text keluaran dari terminal
18  mov ebx, 4
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 0
2: $ebx = 0
1: $eax = 1
penjelasan:
pointer debug sekarang berada pada line ke 18 dengan code program "mov ebx, 4". Artinya line ke 17 telah di eksekusi dengan memasukan nilai 1 ke register eax.

10 lanjutkan proses debug ke line selanjutnya hingga akhir dengan command
ni
text keluaran terminal:
20  mov ecx, eax
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 0
2: $ebx = 4
1: $eax = 1
22  mov eax, [a]
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 4
1: $eax = 1
23  mov ebx, [b]
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 4
1: $eax = 4
25  mov dword[result], eax
6: result = 0
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 1
1: $eax = 4
28  mov eax, 1
6: result = 4
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 1
1: $eax = 4
29  int 0x806: result = 4
5: b = 1
4: a = 4
3: $ecx = 1
2: $ebx = 1
1: $eax = 1
[Inferior 1 (process 5991) exited with code 01]


~ sekian ~




















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~