KALKULATOR ASSEMBLY Lutfi Budi Ilmawan
1. Analisis Kebutuhan Awal Penggunaan aplikasi kalkulator dengan menggunakan bahasa assembly sesuai dengan kode program yang terlampir membutuhkan operand-operand dalam bentuk integer. Operand-operand tersebut menggunakan register 8 bit. Untuk kebutuhan proses, program akan melakukan penjumlahan, pengurangan, perkalian dan pembagian. Sedangkan output yang dihasilkan dalam bentuk integer. Kode program yang dibuat dapat berjalan pada sistem operasi linux dengan arsitektur prosesor intel 32 bit. Pada proses aritmetika digunakan register al dan register bl untuk menyimpan nilai inputan angka. Di mana register al dan bl ini adalah register 8 bit. Berikut register-register dam jumlah bitnya: Jumlah Bit 32 bit 16 bit 8 bit
Register EAX, EBX, ECX, EDX AX, BX, CX, DX AH, AL, BH, BL, CH, CL, DH, DL
2. Algoritma Program a) Proses penjumlahan Untuk proses penjumlahan digunakan instruksi add seperti terlihat pada gambar di bawah:
Instruksi add di atas berarti nilai dalam register bl dijumlahkan ke dalam nilai register al, jadi nilai akhir tersimpan pada register al. b) Proses Pengurangan Untuk proses penguragan digunakan instruksi sub, penggunaannya bisa dilihat pada gambar di bawah:
Instruksi sub di atas untuk mengurangkan nilai pada register al dengan nilai pada register bl, dan hasilnya akan disimpan di register al. c) Proses Perkalian Untuk proses perkalian digunakan instruksi sub. Instruksi sub menggunakan register tertentu sebagai multiplicand dan hasil operasinya, tergantung pada jumlah bit pada multiplier-nya. Multiplicand Multiplier Hasil kali AL 8 BIT AX AX 16 BIT DX , AX EAX 32 BIT EDX , EAX
Pada program kalkulator ini menggunakan register 8 bit sebagai operand-nya. Jadi multiplicand yang digunakan adalah register al.
Dari gambar di atas diketahui bahwa register bl adalah register 8 bit, maka multiplicandnya adalah register al dan hasil perkaliannya akan disimpan pada register ax. d) Proses Pembagian Pada proses pembagian digunakan instruksi div, format penulisan instruksi div sebagai berikut: div [nama_register] Sama dengan instruksi sub, instruksi div menggunakan register-register tertentu untuk operand-nya. Hasil bagi Pembagi Dividend Ax 8 bit AL Dx 16 bit AX Edx 32 bit EAX Program kalkulator yang dibuat menggunakan operand dengan register 8 bit. Penggunaan instruksi sub pada program kalkulator yang dibuat dapat dilihat pada gambar di bawah:
Dari gambar di atas diketahui bahwa yang digunakan register bl (register 8 bit), maka dividend yang digunakan adalah register al dan hasil bagi akan tersimpan pada register ax. 3. Flowchart Program Kalkulator Flowchart dari program kalkulator sebagai mana diperlihatkan pada gambar di bawah. Mula-mula user menginputkan nilai pertama kemudian nilai kedua, nilai yang dimasukkan harus berupa integer. Setelah memasukkan nilai, user kemudian memilih jenis operasi, angka 1 untuk proses penjumlahan, angka 2 untuk proses pengurangan, angka 3 untuk proses perkalian, dan angka 4 untuk proses pembagian. Jika dimasukkan angka selain 1 sampai dengan angka 4, maka program akan melakukan perulangan untuk melakukan input operasi sampai jenis operasi yang dimasukkan benar. Seperti terlihat pada gambar di bawah:
Instruksi yang digunakan untuk meembandingkan nilai antara operand adalah instruksi cmp.
Instruksi cmp pada gambar di atas berarti membandingkan nilai dari register ah dengan angka 1. Instruksi je (jump if equal) untuk melakukan jump jika nilai dari operand yang dibandingkan bernilai sama.Setelah memilih jenis operasi yang benar maka program akan mengeksekusi statement sesuai dengan pilihan yang dimasukkan, kemudian hasil operasi akan ditampilkan. Flowchart dapat program dapat dilihat pada gambar di bawah:
start
Read num1, num2, opc
opc = 1?
Y
result = num1 + num2
N opc = 2?
Y
result = num1 - num2
N
opc = 3?
Y
result = num1 * num2
N
opc = 4?
Y
result = num1 / num2
N write ‘Pilihan Salah’ write result
end
4. Implementasi a) Proses Compile Program dengan bahasa assembly ini dijalankan pada komputer dengan arsitektur intel 32 bit. Dan di-compile pada sistem operasi linux dengan menggunakan nasm, nasm merupakan compiler untuk bahasa assembly pada linux. Nama file source code program adalah kalkulator.asm perintahnya: $ nasm -f elf kalkulator.asm b) Proses Linking Proses linking output file menjadi file executable dengan memasukkan perintah: $ ld -m elf_i386 -s -o kalkulator kalkulator.o c) Proses Running Program Untuk menjalankan hasil file executable dengan menjalankan perintah: $ ./kalkulator Setelah program dijalankan maka user akan diminta untuk melakukan input terhadap nilai I.
Selanjutnya tekan enter untuk melakukan input untuk nilai II.
Setelah melakukan input angka, selanjutnya melakukan input terhadap jenis operasi. Jenis operasi dapat dipilih berdasarkan angka: 1 untuk proses penjumlahan 2 untuk proses pengurangan 3 untuk proses perkalian 4 untuk proses pembagian
Tekan enter untuk melihat hasil operasi.
LAMPIRAN KODE PROGRAM section .data ; Messages msg1 lmsg1
db equ
10,'-Kalkulator Sederhana-',10,0 $ - msg1
msg2 lmsg2
db equ
10,'Angka I: ',0 $ - msg2
msg3 lmsg3
db equ
'Angka II: ',0 $ - msg3
msg4 lmsg4
db equ
10,'1. Penjumlahan',10,0 $ - msg4
msg5 lmsg5
db equ
'2. Pengurangan',10,0 $ - msg5
msg6 lmsg6
db equ
'3. Perkalian',10,0 $ - msg6
msg7 lmsg7
db equ
'4. Pembagian',10,0 $ - msg7
msg8 lmsg8
db equ
'Pilih Operasi: ',0 $ - msg8
msg9 lmsg9
db equ
10,'Hasil Operasi: ',0 $ - msg9
msg10 lmsg10
db equ
nlinea lnlinea
db equ
10,'Pilihan Salah',10,0 $ - msg10 10,10,0 $ - nlinea
section .bss ; Spaces reserved for storing the values provided by the user. opc: num1: num2: result:
resb 2 resb 2 resb 2 resb 2
section .text global _start _start: ; Menampilkan isi text dari variabel msg1 mov eax, 4
mov ebx, 1 mov ecx, msg1 mov edx, lmsg1 int 80h ; Menampilkan isi text dari variabel msg2 mov eax, 4 mov ebx, 1 mov ecx, msg2 mov edx, lmsg2 int 80h ; Input variabel num1 mov eax, 3 mov ebx, 0 mov ecx, num1 mov edx, 2 int 80h ; Menampilkan isi text dari variabel msg3 mov eax, 4 mov ebx, 1 mov ecx, msg3 mov edx, lmsg3 int 80h ; Input variabel num2 mov eax, 3 mov ebx, 0 mov ecx, num2 mov edx, 2 int 80h ; Menampilkan isi text dari variabel msg4 mov eax, 4 mov ebx, 1 mov ecx, msg4 mov edx, lmsg4 int 80h ; Menampilkan isi text dari variabel msg5 mov eax, 4 mov ebx, 1 mov ecx, msg5 mov edx, lmsg5 int 80h ; Menampilkan isi text dari variabel msg6 mov eax, 4 mov ebx, 1 mov ecx, msg6 mov edx, lmsg6 int 80h ; Menampilkan isi text dari variabel msg7 mov eax, 4
mov ebx, 1 mov ecx, msg7 mov edx, lmsg7 int 80h ulangi: ; Menampilkan isi text dari variabel msg8 mov eax, 4 mov ebx, 1 mov ecx, msg8 mov edx, lmsg8 int 80h ; Input jenis operasi mov ebx,0 mov ecx,opc mov edx,2 mov eax,3 int 80h mov ah, [opc] ; memindahkan value dari jenis operasi ke registry ah sub ah, '0' ; Convert dari ascii ke decimal ; Membandingkan value dari jenis operasi yang dimasukkan untuk mengetahui jenis operasi yang akan dilakukan cmp ah, 1 je add cmp ah, 2 je subtract cmp ah, 3 je multiply cmp ah, 4 je divide ; Jika jenis operasi yang dimasukkan tidak dalam daftar ; maka akan tampil pesan error dan aplikasi tertutup. mov eax, 4 mov ebx, 1 mov ecx, msg10 mov edx, lmsg10 int 80h jmp ulangi add: ; simpan nilai num1 dan num2 pada register al and bl mov al, [num1] mov bl, [num2] ; Convert dari ascii ke decimal sub al, '0' sub bl, '0' ; Proses penjumlahan add al, bl
; konversi dari decimal ke ascii add al, '0' ; move the result mov [result], al ; Menampilkan isi text dari variabel msg9 mov eax, 4 mov ebx, 1 mov ecx, msg9 mov edx, lmsg9 int 80h ; Menampilkan hasil operasi mov eax, 4 mov ebx, 1 mov ecx, result mov edx, 2 int 80h ; Proses penjumlahan selesai jmp exit subtract: ; simpan nilai num1 dan num2 pada register al and bl mov al, [num1] mov bl, [num2] ; Convert dari ascii ke decimal sub al, '0' sub bl, '0' ; Proses pengurangan sub al, bl ; konversi dari decimal ke ascii add al, '0' ; move the result mov [result], al ; Menampilkan isi text dari variabel msg9 mov eax, 4 mov ebx, 1 mov ecx, msg9 mov edx, lmsg9 int 80h ; Menampilkan hasil operasi mov eax, 4 mov ebx, 1 mov ecx, result mov edx, 1 int 80h
; Proses pengurangan selesai jmp exit multiply: ; simpan nilai num1 dan num2 pada register al and bl mov al, [num1] mov bl, [num2] ; Convert dari ascii ke decimal sub al, '0' sub bl, '0' ; Proses perkalian. AX = AL x BL mul bl ; konversi dari decimal ke ascii add ax, '0' ; move the result mov [result], ax ; Menampilkan isi text dari variabel msg9 mov eax, 4 mov ebx, 1 mov ecx, msg9 mov edx, lmsg9 int 80h ; Menampilkan hasil operasi mov eax, 4 mov ebx, 1 mov ecx, result mov edx, 1 int 80h ; Proses perkalian selesai jmp exit divide: ; simpan nilai num1 dan num2 pada register al and bl mov al, [num1] mov bl, [num2] mov dx, 0 mov ah, 0 ; Convert dari ascii ke decimall sub al, '0' sub bl, '0' ; Proses pembagian. AX = AL / BL div bl ; Konversi dari decimal ke ascii
add ax, '0' ; move the result mov [result], ax ; Menampilkan isi text dari variabel msg9 mov eax, 4 mov ebx, 1 mov ecx, msg9 mov edx, lmsg9 int 80h ; Print on screen the result mov eax, 4 mov ebx, 1 mov ecx, result mov edx, 1 int 80h ; Proses pembagian selesai jmp exit exit: mov eax, 4 mov ebx, 1 mov ecx, nlinea mov edx, lnlinea int 80h ; Akhir dari program mov eax, 1 mov ebx, 0 int 80h