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