Skip to content

Latest commit

 

History

History

08_fungsi_aritmatika

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Fungsi Aritmatika

Instruksi INC

Instruksi INC digunakan untuk menambah operand satu per satu. inc bekerja pada operand tunggal yang dapat berupa register, atau memori.

Contoh dari syntax :

INC     dest
INC     EBX         ; incr 32 bit register
INC     DL          ; incr 8 bit register
INC     [hitung]    ; incr variabel hitung

Instruksi DEC

Instruksi DEC digunakan untuk mengurangi operand satu per-satu. Ia bekerja pada operand tunggal yang dapat berupa register, atau memori.

Contoh :

segment .data
    count   dw  0
    value   db  15

segment .text
    inc     [jumlah]
    dec     [value]

    mov     ebx, jumlah
    inc     word    [ebx]

    mov     esi, value
    dec     byte    [esi]

Instruksi ADD dan SUB

Instruksi ADD dan SUB digunakan untuk melakukan penjumlah pengurang sederhana dari data biner dalam ukuran byte, word dandouble word, yaitu untuk menambah, atau mengurangi operand 8 bit, 16 bit, atau 32 bit, masing-masing.

Contoh syntax :

ADD/SUB     destination, source

Instruksi ADD/SUB dapat dilakukan, antara lain :

  • register
  • memmory untuk register
  • register untuk memmory
  • register untuk constant
  • memmory untuk constant

Namun, seperti instruksi lainnya, operasi memori ke memori tidak dimungkinkan menggunakan instruksi add/sub. Operasi add, dan sub mengatur, atau menghapus flag overflow, dan carry.

Contoh : Contoh berikut akan meminta dua digit dari pengguna, menyimpan digit masing-masing di register EAX, dan EBX, menambah nilai, menyimpan hasilnya di lokasi memori, res, dan akhirnya menampilkan hasilnya.

SYS_EXIT  equ 1
SYS_READ  equ 3
SYS_WRITE equ 4
STDIN     equ 0
STDOUT    equ 1

segment .data
    pesan_input     db  'masukkan angka ', 0xA, 0xD
    panjang_pesan_input equ $- pesan_input

    pesan_input2    db  'masukkan angka kedua ', 0xA, 0xD
    panjang_pesan_input2 equ $- pesan_input2

    pesan_hasil    db  'hasilnya adalah '
    panjang_pesan_hasil   equ $- pesan_hasil

segment .bss

    angka1  resb    2
    angka2  resb    2
    res     resb    1

section .text
    global _start

_start:
    mov eax, SYS_WRITE         
    mov ebx, STDOUT         
    mov ecx, pesan_input         
    mov edx, panjang_pesan_input
    int 0x80                

    mov eax, SYS_READ 
    mov ebx, STDIN  
    mov ecx, angka1 
    mov edx, 2
    int 0x80            

    mov eax, SYS_WRITE        
    mov ebx, STDOUT         
    mov ecx, pesan_input2          
    mov edx, panjang_pesan_input2 
    int 0x80

    mov eax, SYS_READ  
    mov ebx, STDIN  
    mov ecx, angka2 
    mov edx, 2
    int 0x80        

    mov eax, SYS_WRITE         
    mov ebx, STDOUT         
    mov ecx, pesan_hasil          
    mov edx, panjang_pesan_hasil  
    int 0x80

    ; pindah nomor pertama ke register EAX dan angka kedua ke EBX
    ; dan subtrak ascii '0' dan convert ke angka desimal

    mov     eax,    [angka1]
    sub     eax,    '0'

    mov     ebx,    [angka2]
    sub     ebx,    '0'
    
    ; tambah eax dan ebx
    add eax, ebx
    add eax, '0'

    mov [res], eax

    ; tampilkan hasil
    mov eax, SYS_WRITE        
    mov ebx, STDOUT
    mov ecx, res         
    mov edx, 1        
    int 0x80

exit:
    mov eax,    SYS_EXIT
    xor ebx,    ebx
    int 0x80

Contoh menambahkan 2 variabel

section .text
    global _start

_start:
    mov     eax, '3'
    sub     eax, '0'
    
    mov     ebx, '7'
    sub     ebx, '0'
    add     eax, ebx
    add     eax, '0'
    

    mov     [hasil], eax
    mov     ecx, pesan
    mov     edx, panjang_pesan
    mov     ebx, 1
    mov     eax, 4
    int     0x80

    mov     ecx, sum
    mov     edx, 1
    mov     ebx, 1
    mov     eax, 4
    int     0x80

    mov     eax, 1
    int     0x80

section .data
    pesan db    'hasil dari 3 + 7 adalah'
    len equ     $ - pesan
    segment .bss
    sum resb    1

Instruksi MUL/IMUL

Ada dua instruksi untuk mengalikan data biner. Instruksi MUL (multiply) mengambil data yang tidak ditandatangani dengan IMUL (integer multiply) menangani data yang ditandatangani. Kedua instruksi mempengaruhi flag carry, dan overflow.

sintaks

MUL/IMUL  perkalian

MUL dalam kedua kasus akan berada di akumulator, tergantung pada ukuran multiplicand, multiplier, dan produk yang dihasilkan juga akan disimpan dalam dua register tergantung pada ukuran operand.

Contoh :

MOV AL, 10
MOV DL, 25  
MUL DL
...
MOV DL, 0FFH
MOV AL, 0BEH
IMUL DL

Contoh berikut mengalikan 3 dengan 3, dan menampilkan :

section	.text
   global _start
	
_start:        

   mov	al,'3'
   sub     al, '0'
	
   mov 	bl, '3'
   sub     bl, '0'
   mul 	bl
   add	al, '0'
	
   mov 	[res], al
   mov	ecx,msg	
   mov	edx, len
   mov	ebx,1	;file descriptor (stdout)
   mov	eax,4	;system call number (sys_write)
   int	0x80	;call kernel
	
   mov	ecx,res
   mov	edx, 1
   mov	ebx,1	
   mov	eax,4	
   int	0x80	
	
   mov	eax,1	
   int	0x80	

section .data
msg db "hasilnya adalah", 0xA,0xD 
len equ $- msg   
segment .bss
res resb 1