Jmp/mov test bench

From Zet

Jump to: navigation, search

This code tests all kind of different jumps and movs that exist on the 8086. The program ends at address 0xf4004 and the result is the number 0x4001 written in address 0.

Code

# mov: 1 (word), 2 (word), 3 (off, base+index+off), 4, 5 (off), 
#      7 (byte,word), 8 (byte off), 9 (word base), 10 (byte,word), 
#      11 (word off, byte base+index), 12 (imm,special)
# jmp: 1, 2, 3 (reg), 3 (mem base+index+off), 4, 5 (mem base+index+off)
.code16
start:
jmp b                   # (2)  jmp
hlt
 
.org 14
b:
movw $0xf000, %bx       # (10) mov word
movw %bx, %ds           # (4)  mov
movw (0xfff3), %ax      # (2)  mov word
jmp *%ax                # (3)  jmp reg
hlt
 
.org 0x1290
ljmp $0xe342, $0xebe0   # (4)  jmp
hlt
 
.org 0x2000
movw $0x1000, %bx       # (10) mov word
movw %bx, %ds           # (4)  mov
 
movb $0xfb, %ah         # (10) mov byte
movb $0xe1, %al         # (10) mov byte
movw %ax, (0x2501)      # (1)  mov word
 
movw $0x1001, (0x2600)  # (11) mov word
movw (0x2600), %ss      # (3)  mov
 
movw %ss, (0x2601)      # (5)  mov
movb (0x2601), %dl      # (8)  mov byte
movb $0x00, %dh         # (10) mov byte
movw %dx, %di           # (7)  mov word
 
movw $0x2506, %bp       # (10) mov word
 
jmp *-22(%bp,%di)       # (3)  jmp mem
hlt                     # m[0x12501] = 0xfbe1
 
.org 0x3001
.byte 0xc7,0xc0        # (12) movw $0x4001, %ax
.word 0x4001           # [not in a default codification]
movw $0x2501, %bx
movw %ax, (%bx)         # (9)  mov word
movw $2, %di
movb $0x00, (%bx,%di)   # (11) mov byte
movb $4, %ch
movb %ch, %cl           # (7)  mov byte
movb $0, %ch
movw %cx, %si
movb $0xf0, -1(%bx,%si)
movw $0x3, %si
ljmp *-24(%bp,%si)      # (5)  jmp mem
hlt
 
.org 0x4001
movw -3(%bx,%si), %ax
movw $0x0, %dx
movw %dx, %ds
movw %ax, (0)
hlt
 
.org 65520
jmp start               # (1)  jmp
.word 0x1290
 
.org 65534
.word 0xffff
 
 
Personal tools