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:
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
Jumlah Bit
Register
32 bit
EAX, EBX, ECX, EDX
16 bit
AX, BX, CX, DX
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
multiplicand-nya adalah register al dan hasil perkalianmultiplicand-nya 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? result = num1 + num2
opc = 2? result = num1 - num2
opc = 3? result = num1 * num2
opc = 4? result = num1 / num2
write result end write ‘Pilihan Salah’
Y
Y
Y
Y
N
N
N
N
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
LAMPIRAN KODE PROGRAM
section .data ; Messages msg1 db 10,'-Kalkulator Sederhana-',10,0 lmsg1 equ $ - msg1 msg2 db 10,'Angka I: ',0 lmsg2 equ $ - msg2 msg3 db 'Angka II: ',0 lmsg3 equ $ - msg3 msg4 db 10,'1. Penjumlahan',10,0 lmsg4 equ $ - msg4 msg5 db '2. Pengurangan',10,0 lmsg5 equ $ - msg5 msg6 db '3. Perkalian',10,0 lmsg6 equ $ - msg6 msg7 db '4. Pembagian',10,0 lmsg7 equ $ - msg7 msg8 db 'Pilih Operasi: ',0 lmsg8 equ $ - msg8 msg9 db 10,'Hasil Operasi: ',0 lmsg9 equ $ - msg9 msg10 db 10,'Pilihan Salah',10,0 lmsg10 equ $ - msg10 nlinea db 10,10,0 lnlinea equ $ - nlinea section .bss; Spaces reserved for storing the values provided by the user. opc: resb 2 num1: resb 2 num2: resb 2 result: 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
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