Division test bench

From Zet

Jump to: navigation, search

This example tests these instructions:

  • div, idiv and aam. Examples include:
  1. word / byte
  2. positive / positive
  3. negative / positive
  4. positive / negative
  5. negative / negative
  6. 0, 1, -1 division
  7. overflow and int 0
  8. 2 random values

Code

.code16
start:
movw $208, %sp
 
# Exception 0 handler
movw $0x1000, (0)
movw $0xf000, (2)
 
movw $208, %bp
 
# div word tests
# easy test
movw $0x0, %dx
movw $0x14, %ax
movw $0x5, %bx
 
movw $0x2, (%bp)
divw %bx
addw $0x2, %bp
 
movw %ax, (128)
movw %bx, (130)
movw %dx, (4)
pushf
 
 
movw $0xa320, %dx
movw $0xc3da, %ax
movw $0xffff, (6)
 
movw $0x4, (%bp)
divw (6)
addw $0x2, %bp
 
movw %ax, (8)
movw %dx, (10)
pushf
 
 
movw $0xffff, %dx
movw $0xffff, %ax
movw $0x1, %cx
 
movw $0x2, (%bp)
divw %cx
addw $0x2, %bp
 
movw %ax, (12)
movw %cx, (14)
movw %dx, (16)
pushf
 
 
movw $0xffff, %dx
movw $0xffff, %ax
movw $0xffff, (18)
 
movw $0x4, (%bp)
divw (18)
addw $0x2, %bp
 
movw %ax, (20)
movw %dx, (22)
pushf
 
 
movw $0xfbb4, %dx
movw $0xc3da, %ax
movw $0xae8e, %cx
 
movw $0x2, (%bp)
divw %cx
addw $0x2, %bp
 
movw %ax, (24)
movw %cx, (26)
movw %dx, (28)
pushf
 
 
movw $0x25c9, %dx
movw $0xf110, %ax
 
movw $0x2, (%bp)
divw %ax
addw $0x2, %bp
 
movw %ax, (30)
movw %dx, (32)
pushf
 
 
# div byte tests
# easy test
movw $0x14, %ax
movw $0x5, %bx
 
movw $0x2, (%bp)
divb %bl
addw $0x2, %bp
 
movw %ax, (34)
movw %bx, (36)
movw %dx, (38)
pushf
 
movw $0xa320, %dx
movw $0xc3da, %ax
movw $0xff, (40)
 
movw $0x4, (%bp)
divb (40)
addw $0x2, %bp
 
movw %ax, (42)
movw %dx, (44)
pushf
 
movw $0xffff, %ax
movb $0x1, %dh
 
movw $0x2, (%bp)
divb %dh
addw $0x2, %bp
 
movw %ax, (46)
movw %dx, (48)
pushf
 
movw $0xffff, %ax
movw $0xffff, (50)
 
movw $0x4, (%bp)
divb (51)
addw $0x2, %bp
 
movw %ax, (52)
movw %dx, (54)
pushf
 
movw $0x008a, %ax
movw $0xae8e, %cx
 
movw $0x2, (%bp)
divb %cl
addw $0x2, %bp
 
movw %ax, (56)
movw %cx, (58)
pushf
 
movw $0x0669, %dx
movw $0x89f3, %ax
 
movw $0x2, (%bp)
divb %al
addw $0x2, %bp
 
movw %ax, (60)
movw %dx, (62)
pushf
 
# idiv word tests
# easy test
movw $0x0, %dx
movw $0x14, %ax
movw $0xfa, %bx
 
movw $0x2, (%bp)
idivw %bx
addw $0x2, %bp
 
movw %ax, (64)
movw %bx, (66)
movw %dx, (68)
pushf
 
 
movw $0xa320, %dx
movw $0xc3da, %ax
movw $0xffff, (70)
 
movw $0x4, (%bp)
idivw (70)
addw $0x2, %bp
 
movw %ax, (72)
movw %dx, (74)
pushf
 
 
movw $0xffff, %dx
movw $0xffff, %ax
movw $0x1, %cx
 
movw $0x2, (%bp)
idivw %cx
addw $0x2, %bp
 
movw %ax, (76)
movw %cx, (78)
movw %dx, (80)
pushf
 
 
movw $0xffff, %dx
movw $0xffff, %ax
movw $0xffff, (82)
 
movw $0x4, (%bp)
idivw (82)
addw $0x2, %bp
 
movw %ax, (84)
movw %dx, (86)
pushf
 
 
movw $0xfbb4, %dx
movw $0xc3da, %ax
movw $0xae8e, %cx
 
movw $0x2, (%bp)
idivw %cx
addw $0x2, %bp
 
movw %ax, (88)
movw %cx, (90)
movw %dx, (92)
pushf
 
 
movw $0x25c9, %dx
movw $0xf110, %ax
 
movw $0x2, (%bp)
idivw %ax
addw $0x2, %bp
 
movw %ax, (94)
movw %dx, (96)
pushf
 
# idiv byte tests
# easy test
movw $0x14, %ax
movw $0x5, %bx
 
movw $0x2, (%bp)
idivb %bl
addw $0x2, %bp
 
movw %ax, (98)
movw %bx, (100)
movw %dx, (102)
pushf
 
 
movw $0xa320, %dx
movw $0xc3da, %ax
movw $0xff, (104)
 
movw $0x4, (%bp)
idivb (104)
addw $0x2, %bp
 
movw %ax, (106)
movw %dx, (108)
pushf
 
 
movw $0xffff, %ax
movb $0x1, %dh
 
movw $0x2, (%bp)
idivb %dh
addw $0x2, %bp
 
movw %ax, (110)
movw %dx, (112)
pushf
 
 
movw $0xffff, %ax
movw $0xffff, (114)
 
movw $0x4, (%bp)
idivb (115)
addw $0x2, %bp
 
movw %ax, (116)
movw %dx, (118)
pushf
 
 
movw $0x008a, %ax
movw $0xae8e, %cx
 
movw $0x2, (%bp)
idivb %cl
addw $0x2, %bp
 
movw %ax, (120)
movw %cx, (122)
pushf
 
 
movw $0x0669, %dx
movw $0x89f3, %ax
 
movw $0x2, (%bp)
idivb %al
addw $0x2, %bp
 
movw %ax, (124)
movw %dx, (126)
pushf
 
 
# AAM tests
movw $0xffff, %ax
 
movw $0x2, (%bp)
aam $0
addw $0x2, %bp
movw %ax, (132)
pushf
 
movw $0x2, (%bp)
aam $1
addw $0x2, %bp
movw %ax, (134)
pushf
 
movw $0xffff, %ax
movw $0x2, (%bp)
aam
addw $0x2, %bp
movw %ax, (136)
pushf
 
movw $0xff00, %ax
movw $0x2, (%bp)
aam $0
addw $0x2, %bp
movw %ax, (138)
pushf
 
movw $0x2, (%bp)
aam $1
addw $0x2, %bp
movw %ax, (140)
pushf
 
movw $0x3ffb, %ax
movw $0x2, (%bp)
aam
addw $0x2, %bp
movw %ax, (142)
pushf
 
hlt
 
# Exception handler (int 0)
.org 0x1000
push %ax
push %di
movw (%bp), %ax
movw %sp, %si
addw $4, %si
movw (%si), %si
movw %si, (%bp)
addw %ax, %si
movw %sp, %di
addw $4, %di
movw %si, (%di)
pop %di
pop %ax
iret
 
.org 65520
jmp start
.org 65535
.byte 0xff
 

Results

Memory contents at the end should be:

0x000:  0x1000  0xf000  0x0000  0xffff  0xa321  0x66fb  0xffff  0x0001
0x010:  0xffff  0xffff  0xffff  0xffff  0xc3da  0xae8e  0xfbb4  0x2821
0x020:  0x5e00  0x0004  0x0005  0x5e00  0x00ff  0x9ec4  0xa320  0xffff
0x030:  0x0120  0xffff  0xffff  0x0120  0x8a00  0xae8e  0x5091  0x0669
0x040:  0x0000  0x00fa  0x0014  0xffff  0xc3da  0xa320  0xffff  0x0001
0x050:  0x0000  0xffff  0x0001  0x0000  0x0d7f  0xae8e  0xf568  0xf110
0x060:  0x25c9  0x0004  0x0005  0x25c9  0x00ff  0xc3da  0xa320  0x00ff
0x070:  0x0120  0xffff  0x0001  0x0120  0x18ff  0xae8e  0x89f3  0x0669
0x080:  0x0004  0x0005  0xffff  0xff00  0x1905  0xff00  0x0000  0x1901
0x090:  0x0000  0xff00  0x0006  0x0006  0x0002  0x0006  0x0002  0x0002
0x0a0:  0x0016  0x0002  0x0006  0x0006  0x0002  0x0006  0x0002  0x0002
0x0b0:  0x0016  0x0006  0x0002  0x0002  0x0006  0x0002  0x0006  0x0006
0x0c0:  0x0012  0x0006  0x0002  0x0002  0x0006  0x0002  0x0006  0x0006
0x0d0:  0x0002  0x0004  0x005f  0x0081  0x009e  0x0002  0x0002  0x0004
0x0e0:  0x010d  0x0128  0x0002  0x0002  0x0002  0x0197  0x0002  0x0004
0x0f0:  0x0002  0x020f  0x0002  0x0249  0x0002  0x0004  0x0002  0x02af
0x100:  0x02c4  0x0002  0x0002  0x02f4  0x0002  0x0002  0xXXXX  0xXXXX
Personal tools