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