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
8 bit AH, AL, BH, BL, CH, CL, DH, DL
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 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? 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
Tekan enter untuk melihat hasil operasi.
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
; 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