Majelis - Instruksi Aritmatika

Instruksi INC

Instruksi INC digunakan untuk menambah satu operan. Ia bekerja pada satu operan yang bisa di register atau di memori.

Sintaksis

Instruksi INC memiliki sintaks berikut -

INC destination

Operan tujuan bisa menjadi 8-bit, 16-bit atau 32-bit operan.

Contoh

INC EBX	     ; Increments 32-bit register
INC DL       ; Increments 8-bit register
INC [count]  ; Increments the count variable

Instruksi DEC

Instruksi DEC digunakan untuk mengurangi satu operan. Ia bekerja pada satu operan yang bisa di register atau di memori.

Sintaksis

Instruksi DEC memiliki sintaks berikut -

DEC destination

Operan tujuan bisa menjadi 8-bit, 16-bit atau 32-bit operan.

Contoh

segment .data
   count dw  0
   value db  15
	
segment .text
   inc [count]
   dec [value]
	
   mov ebx, count
   inc word [ebx]
	
   mov esi, value
   dec byte [esi]

Petunjuk ADD dan SUB

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

Sintaksis

Instruksi ADD dan SUB memiliki sintaks berikut -

ADD/SUB	destination, source

Instruksi ADD / SUB dapat dilakukan antara -

  • Daftar untuk mendaftar
  • Memori untuk mendaftar
  • Daftarkan ke memori
  • Daftarkan ke data konstan
  • Memori ke data konstan

Namun, seperti instruksi lainnya, operasi memori-ke-memori tidak dimungkinkan menggunakan instruksi ADD / SUB. Operasi TAMBAHKAN atau SUB menyetel atau menghapus tanda luapan dan bawa.

Contoh

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

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

segment .data 

   msg1 db "Enter a digit ", 0xA,0xD 
   len1 equ $- msg1 

   msg2 db "Please enter a second digit", 0xA,0xD 
   len2 equ $- msg2 

   msg3 db "The sum is: "
   len3 equ $- msg3

segment .bss

   num1 resb 2 
   num2 resb 2 
   res resb 1    

section	.text
   global _start    ;must be declared for using gcc
	
_start:             ;tell linker entry point
   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg1         
   mov edx, len1 
   int 0x80                

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

   mov eax, SYS_WRITE        
   mov ebx, STDOUT         
   mov ecx, msg2          
   mov edx, len2         
   int 0x80

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

   mov eax, SYS_WRITE         
   mov ebx, STDOUT         
   mov ecx, msg3          
   mov edx, len3         
   int 0x80

   ; moving the first number to eax register and second number to ebx
   ; and subtracting ascii '0' to convert it into a decimal number
	
   mov eax, [num1]
   sub eax, '0'
	
   mov ebx, [num2]
   sub ebx, '0'

   ; add eax and ebx
   add eax, ebx
   ; add '0' to to convert the sum from decimal to ASCII
   add eax, '0'

   ; storing the sum in memory location res
   mov [res], eax

   ; print the sum 
   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

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Enter a digit:
3
Please enter a second digit:
4
The sum is:
7

The program with hardcoded variables −

section	.text
   global _start    ;must be declared for using gcc
	
_start:             ;tell linker entry point
   mov	eax,'3'
   sub     eax, '0'
	
   mov 	ebx, '4'
   sub     ebx, '0'
   add 	eax, ebx
   add	eax, '0'
	
   mov 	[sum], eax
   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,sum
   mov	edx, 1
   mov	ebx,1	;file descriptor (stdout)
   mov	eax,4	;system call number (sys_write)
   int	0x80	;call kernel
	
   mov	eax,1	;system call number (sys_exit)
   int	0x80	;call kernel
	
section .data
   msg db "The sum is:", 0xA,0xD 
   len equ $ - msg   
   segment .bss
   sum resb 1

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The sum is:
7

Instruksi MUL / IMUL

Ada dua instruksi untuk mengalikan data biner. Instruksi MUL (Multiply) menangani data unsigned dan IMUL (Integer Multiply) menangani data yang ditandatangani. Kedua instruksi tersebut mempengaruhi flag Carry dan Overflow.

Sintaksis

Sintaks untuk instruksi MUL / IMUL adalah sebagai berikut -

MUL/IMUL multiplier

Perkalian dalam kedua kasus akan berada dalam akumulator, tergantung pada ukuran pengali dan pengali dan produk yang dihasilkan juga disimpan dalam dua register tergantung pada ukuran operan. Bagian berikut menjelaskan instruksi MUL dengan tiga kasus berbeda -

Sr.No. Skenario
1

When two bytes are multiplied −

Pengali ada di register AL, dan pengali adalah byte di memori atau di register lain. Produk ada di AX. 8 bit orde tinggi produk disimpan dalam AH dan 8 bit orde rendah disimpan di AL.

2

When two one-word values are multiplied −

Pengali harus ada di register AX, dan pengali adalah kata dalam memori atau register lain. Misalnya, untuk instruksi seperti MUL DX, Anda harus menyimpan pengali di DX dan pengali di AX.

Produk yang dihasilkan adalah kata ganda, yang akan membutuhkan dua register. Bagian urutan tinggi (paling kiri) disimpan di DX dan bagian urutan bawah (paling kanan) disimpan di AX.

3

When two doubleword values are multiplied −

Ketika dua nilai kata ganda dikalikan, perkalian dan harus dalam EAX dan pengganda adalah nilai kata ganda yang disimpan di memori atau di register lain. Produk yang dihasilkan disimpan dalam register EDX: EAX, yaitu 32 bit orde tinggi disimpan dalam register EDX dan 32 bit orde rendah disimpan dalam register EAX.

Contoh

MOV AL, 10
MOV DL, 25
MUL DL
...
MOV DL, 0FFH	; DL= -1
MOV AL, 0BEH	; AL = -66
IMUL DL

Contoh

Contoh berikut mengalikan 3 dengan 2, dan menampilkan hasilnya -

section	.text
   global _start    ;must be declared for using gcc
	
_start:             ;tell linker entry point

   mov	al,'3'
   sub     al, '0'
	
   mov 	bl, '2'
   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	;file descriptor (stdout)
   mov	eax,4	;system call number (sys_write)
   int	0x80	;call kernel
	
   mov	eax,1	;system call number (sys_exit)
   int	0x80	;call kernel

section .data
msg db "The result is:", 0xA,0xD 
len equ $- msg   
segment .bss
res resb 1

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The result is:
6

Instruksi DIV / IDIV

Operasi pembagian menghasilkan dua elemen - a quotient dan a remainder. Dalam kasus perkalian, luapan tidak terjadi karena register panjang ganda digunakan untuk menyimpan produk. Namun, dalam kasus pembagian, luapan dapat terjadi. Prosesor menghasilkan interupsi jika terjadi overflow.

Instruksi DIV (Divide) digunakan untuk data unsigned dan IDIV (Integer Divide) digunakan untuk data yang ditandatangani.

Sintaksis

Format untuk instruksi DIV / IDIV -

DIV/IDIV	divisor

Dividen ada di akumulator. Kedua instruksi dapat bekerja dengan operan 8-bit, 16-bit atau 32-bit. Operasi tersebut mempengaruhi keenam bendera status. Bagian berikut menjelaskan tiga kasus pembagian dengan ukuran operan yang berbeda -

Sr.No. Skenario
1

When the divisor is 1 byte −

Dividen diasumsikan berada di register AX (16 bit). Setelah pembagian, hasil bagi pergi ke register AL dan sisanya ke register AH.

2

When the divisor is 1 word −

Dividen diasumsikan sepanjang 32 bit dan dalam register DX: AX. 16 bit orde tinggi ada di DX dan 16 bit orde rendah ada di AX. Setelah pembagian, hasil bagi 16-bit masuk ke register AX dan sisanya 16-bit masuk ke register DX.

3

When the divisor is doubleword −

Dividen diasumsikan 64 bit dan di EDX: register EAX. 32 bit orde tinggi ada di EDX dan 32 bit orde rendah ada di EAX. Setelah pembagian, hasil bagi 32-bit masuk ke register EAX dan sisa 32-bit masuk ke register EDX.

Contoh

Contoh berikut membagi 8 dengan 2. The dividend 8 disimpan di 16-bit AX register dan divisor 2 disimpan di 8-bit BL register.

section	.text
   global _start    ;must be declared for using gcc
	
_start:             ;tell linker entry point
   mov	ax,'8'
   sub     ax, '0'
	
   mov 	bl, '2'
   sub     bl, '0'
   div 	bl
   add	ax, '0'
	
   mov 	[res], ax
   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	;file descriptor (stdout)
   mov	eax,4	;system call number (sys_write)
   int	0x80	;call kernel
	
   mov	eax,1	;system call number (sys_exit)
   int	0x80	;call kernel
	
section .data
msg db "The result is:", 0xA,0xD 
len equ $- msg   
segment .bss
res resb 1

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The result is:
4