/* personal notes of renzo diomedi */

~ 00001100 ~

if you divide 9 by 2 , this produces two parts to the answer. The quotient is the number of times the divisor goes into the dividend. The remainder is how much is left over (the fractional part of the answer). The division instructions produce both the quotient and remainder parts as results of the division.

DIV (unsigned) and IDIV (signed) instructions are used for integer division.

Unsigned division

The DIV instruction is used for dividing unsigned integers. The format of the DIV instruction is div divisor

where divisor is the value that is divided into the implied dividend, and can be an 8-, 16-, or 32-bit register or value in memory. The dividend must already be stored in the AX register (for a 16-bit value), the DX:AX register pair (for a 32-bit value), or the EDX:EAX register pair (for a 64-bit value) before the DIV instruction is performed.

The maximum value allowed for the divisor depends on the size of the dividend. For a 16-bit dividend, the divisor can only be 8 bits, for a 32-bit dividend 16 bits, and for a 64-bit dividend the divisor can only be 32 bits.

The result of the division is two separate numbers: the quotient and the remainder. Both values are stored in the same registers used for the dividend value.

This means that you will LOSE the value of the dividend when the division completes.

Then the result will alter the value of the DX or EDX registers

divtest2.s

divtest2.o

divtest2.exe # windows environment

C:\>gdb -q users\rnz\desktop\divtest2.exe

Reading symbols from users\rnz\desktop\divtest2.exe...done.

(gdb) break 2

Breakpoint 1 at 0x401000: file users\rnz\desktop\divtest2.s, line 2.

(gdb) run

Starting program: C:\users\rnz\desktop\divtest2.exe

[New Thread 7120.0x2810]

Breakpoint 1, ?? () at users\rnz\desktop\divtest2.s:14

14 nop

(gdb) s

15 movb dividend, %al

(gdb) s

16 movb dividend+1, %ah

(gdb) s

17 divb divisor

(gdb) s

18 movb %al, quotient

(gdb) s

19 movb %ah, remainder

(gdb) print $ah

$1 = 1

(gdb) print $al

$2 = 4

(gdb) print $ax

$3 = 260 # 256+4

Signed division

The IDIV instruction is used exactly like the DIV instruction, but for dividing signed integers. It too uses an implied dividend, located in the AX register, the DX:AX register pair, or the EDX:EAX register pair.

Unlike the IMUL instruction, there is only one format for the IDIV instruction, which specifies the divisor used in the division:

idiv divisor

where divisor can again be an 8-, 16-, or 32-bit register or value in memory.

For signed integer division, the sign of the remainder is always the sign of the dividend.

the size of the dividend must be twice the size of the divisor

The biggest problem with integer division is detecting when an error condition has occurred, such as when a division by zero happens, or the quotient (or remainder) overflows the destination register. When an error occurs, the system produces an interrupt, which will produce an error on the Linux system,

$ ./progname

Floating point exception