abc Asembler - elektronski priručnik
X dio Aritmetičke instrukcije
Instrukcije DIV/IDIV
Operacija dijeljenja generiše dva elementa - kvocijent i ostatak (remainder). U slučaju množenja, ne pojavljuje se prekoračenje (overflow) zato što se za čuvanje proizvoda koriste registri dvostruke dužine. Međutim, u slučaju dijeljenja, overflow se može pojaviti. Procesor generiše prekid (interrupt) ako se pojavi prekoračenje (overflow).
Instrukcija DIV (Divide) se koristi za neoznačene (unsigned) podatke, a IDIV (Integer Divide) se koeristi za označene podatke.
Sintaksa
Format za DIV/IDIV instrukciju:
DIV/IDIV divisor
Djeljenik (dividend) je u akumulatoru. Obe instrukcije mogu raditi sa 8-bitnim, 16-bitnim ili 32-bitnim operandima. Operacija zahvata svih 6 statusnih flagova. Sljedeći odjeljak objašnjava 3 slučaja dijeljenja sa različitom veličinom operanda:
SN |
Scenario |
1 |
Kada je djelitelj (divisor) 1 bajt -
Za dividend se pretpostavlja da je u AX registru (16 bita). Nakon dijeljenja, kvocijent ide u AL registar, a ostatak (remainder) ide u AH registar.
|
2 |
Kada je djelitelj (divisor) 1 word -
Za dividend se pretpostavlja da je 32 bita dug i da je u DX:AX registrima. 16 bitova višeg reda su u DX, a 16 bitova nižeg reda su u AX. Nakon dijeljenja, 16-bitni kvocijent ide u AX registar, a 16-bitni ostatak ide u DX registar.
|
3 |
Kada je djelitelj (divisor) doubleword -
Za dividend se pretpostavlja da je 64 bita dug i da je u EDX:EAX registrima. 32 bita višeg reda su u EDX,a 32 bita nižeg reda su u EAX. Nakon dijeljenja, 32-bitni kvocijent ide u EAX registar, a 32-bitni ostatak ide u EDX registar.
|
Primjer
Sljedeći primjer dijeli 8 sa 2. Dividend 8 je spremljen u 16-bitni AX registar, a divisor 2 je spremljen u 8-bitni BL registar.
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 "Rezultat je:", 0xA, 0xD
len equ $- msg
segment .bss
res resb 1
Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:
The result is:
4
Instrukcije MUL/IMUL < Index > Logičke instrukcije
|
 |