This is an old revision of the document!


Tiny embeddable Intel 80186/80188 disassembler

This is a complete disassembler supporting the full instruction set of Intel 80186/80188 CPUs (16-bit x86 for embedded applications - essentially a 286 without protected mode, as far as a disassembler is concerned). I wrote this in 1996 and have since placed it in the public domain.

Download i186dasm.zip (includes .asm and .com files).

Quite possibly this is the smallest disassembler of its kind (for a complete CISC CPU architecture). The .asm source for the disassembler is under 17 KB, the resulting compiled program is around 2.5 KB, of which only 164 bytes are the disassembler code (the rest is data and an optional tiny wrapper program to test/demonstrate the disassembler function by having it disassemble and print itself under DOS).

While there might be little need for a 186-only disassembler and for embedding it right into the device these days, the general approach at writing a disassembler/decoder may well be re-used for other processor architectures, other binary file formats (not necessarily programs), and in other programming languages, although having the source in assembly made it particularly easy to specify the data structures with ASCII text (instruction and register names, etc.), bitmasks, and pointers inter-mixed.

Back to other source code snippets and frameworks placed in the public domain.

; Tiny i80186/80188 disassembler:
; * suitable for embedded applications;
; * less than 2.5 KB compiled (164 bytes code).
;
; Use Borland's TASM to assemble:
;
;	tasm disasm.asm /m
;	tlink disasm.obj /t /x
;
; Written by Solar Designer <solar at openwall.com> in 1996, and now placed
; in the public domain -- 2000/11/26 SD.

.model tiny
.code
.186
.startup

IfNDef EMBEDDED
mov  si,100h ; for brainless debuggers.. 
@@TestLoop: 
mov  di,8000h 
call Disasm
mov  ax,0A0Dh
stosw 
mov  ax,900h+'$'
stosb
mov  dx,8000h
int  21h
cmp  si,offset PrintFns 
jb   @@TestLoop 
retn
EndIf

DisAsm:
cld
mov  bp,offset daMain
xor  ax,ax
cwd
push ax
@@DisAsmLoop:
mov  al,cs:[bp]
inc  bp
cmp  al,8
jb   @@StringDone
stosb
jmp  short @@DisAsmLoop
@@StringDone:
cmp  al,7
je   @@DisAsmDone
cmp  ax,dx
jbe  @@Processed
mov  dx,ax
@@Processed:
mov  bx,ax
mov  al,cs:[bp]
mov  cl,[si+bx]
cmp  al,0FCh
jb   @@ShiftLoop
inc  bp
and  al,3
mov  bx,ax
add  bx,ax
call word ptr cs:[PrintFns+bx]
xchg ax,bx
jmp  short @@DisAsmLoop
@@ShiftLoop:
test al,1
jnz  @@ShiftDone
shr  cl,1
shr  al,1
jnz  @@ShiftLoop
jmp  short @@DisAsmDone
@@ShiftDone:
mov  bx,ax
and  al,cl
add  bx,bx
add  bx,3
add  bx,bp
add  bp,ax
add  bp,ax
mov  bp,cs:[bp+1]
test bp,8000h
jz   @@NoCall
push bx
@@NoCall:
and  bp,7FFFh
jnz  @@DisAsmLoop
@@DisAsmDone:
pop  bp
or   bp,bp
jnz  @@DisAsmLoop
add  si,dx
inc  si
retn

PrintRelW:
mov  dl,2
mov  ax,[si+1]
inc  ax
jmp  short PrintRel

PrintRelB:
mov  al,cl
cbw

PrintRel:
inc  ax
inc  ax
add  ax,si
xchg al,ah
call PrintByte
xchg al,ah
call PrintByte
retn

PrintSX:
mov  al,cl
cbw
mov  al,ah
call PrintByte

PrintASIS:
mov  al,cl

PrintByte:
push ax
shr  al,4 
call PrintNibble
pop  ax
and  al,0Fh 
PrintNibble: 
add  al,90h
daa
adc  al,40h
daa
stosb
ret

PrintFns:
dw   PrintRelW, PrintRelB, PrintSX, PrintASIS

daSpace = 9
daCall = 8000h

daMain:
db   0, 0F8h
dw   da00, da08, da10, da18, da20, da28, da30, da38
dw   da40, da48, da50, da58, da60, da68, da70, da78
dw   da80, da88, da90, da98, daA0, daA8, daB0, daB8
dw   daC0, daC8, daD0, daD8, daE0, daE8, daF0, daF8

daXX:
db   'DB', daSpace, 0, 0FFh

daDone: 
db   7

daXX2:
db   'DB', daSpace, 0, 0FFh, ',', 1, 0FFh, 7

daModRM:
db   1, 0C0h
dw   daRM00, daRM40, daRM80, daRMC0

daRM00:
db   1, 7
dw   daMBXSI, daMBXDI, daMBPSI, daMBPDI
dw   daMSI, daMDI, daMd16, daMBX

daMBXSI:
db   '[BX+SI]', 7

daMBXDI:
db   '[BX+DI]', 7

daMBPSI:
db   '[BP+SI]', 7

daMBPDI:
db   '[BP+DI]', 7

daMSI:
db   '[SI]', 7

daMDI:
db   '[DI]', 7

daMd16:
db   '[', 3, 0FFh, 2, 0FFh, ']', 7

daMBX:
db   '[BX]', 7

daRM40:
db   1, 7
dw   daMBXSId8, daMBXDId8, daMBPSId8, daMBPDId8
dw   daMSId8, daMDId8, daMBPd8, daMBXd8

daMBXSId8:
db   '[BX+SI+', 2, 0FEh, ']', 7

daMBXDId8:
db   '[BX+DI+', 2, 0FEh, ']', 7

daMBPSId8:
db   '[BP+SI+', 2, 0FEh, ']', 7

daMBPDId8:
db   '[BP+DI+', 2, 0FEh, ']', 7

daMSId8:
db   '[SI+', 2, 0FEh, ']', 7

daMDId8:
db   '[DI+', 2, 0FEh, ']', 7

daMBPd8:
db   '[BP+', 2, 0FEh, ']', 7

daMBXd8:
db   '[BX+', 2, 0FEh, ']', 7

daRM80:
db   1, 7
dw   daMBXSId16, daMBXDId16, daMBPSId16, daMBPDId16
dw   daMSId16, daMDId16, daMBPd16, daMBXd16

daMBXSId16:
db   '[BX+SI+', 3, 0FFh, 2, 0FFh, ']', 7

daMBXDId16:
db   '[BX+DI+', 3, 0FFh, 2, 0FFh, ']', 7

daMBPSId16:
db   '[BP+SI+', 3, 0FFh, 2, 0FFh, ']', 7

daMBPDId16:
db   '[BP+DI+', 3, 0FFh, 2, 0FFh, ']', 7

daMSId16:
db   '[SI+', 3, 0FFh, 2, 0FFh, ']', 7

daMDId16:
db   '[DI+', 3, 0FFh, 2, 0FFh, ']', 7

daMBPd16:
db   '[BP+', 3, 0FFh, 2, 0FFh, ']', 7

daMBXd16:
db   '[BX+', 3, 0FFh, 2, 0FFh, ']', 7

daRMC0:
db   0, 1
dw   daRMC0b, daRMC0w

daRMC0b:
db   1, 7
dw   daAL, daCL, daDL, daBL, daAH, daCH, daDH, daBH

daOUTDXAL:
db   'OUT', daSpace, 'DX,' 

daAL:
db   'AL', 7

daRCL:
db   'R' 

daCL:
db   'CL', 7

daDL:
db   'DL', 7

daBL:
db   'BL', 7

daAH:
db   'AH', 7

daCH:
db   'CH', 7

daDH:
db   'DH', 7

daBH:
db   'BH', 7

daRMC0w:
db   1, 7
dw   daAX, daCX, daDX, daBX, daSP, daBP, daSI, daDI

daOUTDXAX:
db   'OUT', daSpace, 'DX,' 

daAX:
db   'AX', 7

daCX:
db   'CX', 7

daINALDX:
db   'IN', daSpace, 'AL,' 

daDX:
db   'DX', 7

daBX:
db   'BX', 7

daSP:
db   'SP', 7

daBP:
db   'BP', 7

daSI:
db   'SI', 7

daDI:
db   'DI', 7

da1R8:
db   0, 7 
dw   daAL, daCL, daDL, daBL, daAH, daCH, daDH, daBH

da1R16:
db   0, 7 
dw   daAX, daCX, daDX, daBX, daSP, daBP, daSI, daDI

da2R8:
db   1, 038h
dw   daAL, daCL, daDL, daBL, daAH, daCH, daDH, daBH

da2R16:
db   1, 038h
dw   daAX, daCX, daDX, daBX, daSP, daBP, daSI, daDI

daImm8:
db   1, 0C0h
dw   daImm8_RM00, daImm8_1, daImm8_2, daImm8_0

daImm8_RM00:
db   1, 3
dw   daImm8_0, daImm8_0, daImm8_CHECK, daImm8_0

daImm8_CHECK:
db   1, 4
dw   daImm8_0, daImm8_2

daImm8SX:
db   1, 0C0h
dw   daImm8SX_RM00, daImm8SX_1, daImm8SX_2, daImm8SX_0

daImm8SX_RM00:
db   1, 3
dw   daImm8SX_0, daImm8SX_0, daImm8SX_CHECK, daImm8SX_0

daImm8SX_CHECK:
db   1, 4
dw   daImm8SX_0, daImm8SX_2

daImm16:
db   1, 0C0h
dw   daImm16_RM00, daImm16_1, daImm16_2, daImm16_0

daImm16_RM00:
db   1, 3
dw   daImm16_0, daImm16_0, daImm16_CHECK, daImm16_0

daImm16_CHECK:
db   1, 4
dw   daImm16_0, daImm16_2

daImm16_0:
db   3, 0FFh

daImm8_0:
db   2, 0FFh, 7

daImm8SX_0:
db   2, 0FEh, 7

daImm16_1:
db   4, 0FFh

daImm8_1:
db   3, 0FFh, 7

daImm8SX_1:
db   3, 0FEh, 7

daImm16_2:
db   5, 0FFh

daImm8_2:
db   4, 0FFh, 7

daImm8SX_2:
db   4, 0FEh, 7

daModRMImm:
db   0, 1
dw   daCall+daModRM, daCall+daModRM
db   ',', 0, 1
dw   daImm8, daImm16

daSeg:
db   1, 018h
dw   daES, daCS, daSS, daDS

daES:
db   'ES', 7

daCS:
db   'CS', 7

daSS:
db   'SS', 7

daDS:
db   'DS', 7

da00:
db   0, 6
dw   daADD, daADD, daADD, daX67EF

da08:
db   0, 6
dw   daOR, daOR, daOR, daX67EF

da10:
db   0, 6
dw   daADC, daADC, daADC, daX67EF

da18:
db   0, 6
dw   daSBB, daSBB, daSBB, daX67EF

da20:
db   0, 6
dw   daAND, daAND, daAND, daX67EF

da28:
db   0, 6
dw   daSUB, daSUB, daSUB, daX67EF

da30:
db   0, 6
dw   daXOR, daXOR, daXOR, daX67EF

da38:
db   0, 6
dw   daCMP, daCMP, daCMP, daX67EF

daX67EF:
db   0, 1
dw   daX6E, daX7F 

daX6E:
db   0, 38h
dw   da06, da0E, da16, da1E, da26, da2E, da36, da3E

daX7F:
db   0, 38h
dw   da07, da0F, da17, da1F, da27, da2F, da37, da3F 

da06:
db   'PUSH', daSpace, 'ES', 7

da07:
db   'POP', daSpace, 'ES', 7

da0E:
db   'PUSH', daSpace, 'CS', 7

da0F = daXX 

da16:
db   'PUSH', daSpace, 'SS', 7

da17:
db   'POP', daSpace, 'SS', 7

da1E:
db   'PUSH', daSpace, 'DS', 7

da1F:
db   'POP', daSpace, 'DS', 7

da26:
db   'ES:', 7

da27:
db   'DAA', 7

da2E:
db   'CS:', 7

da2F:
db   'DAS', 7

da36:
db   'SS:', 7

da3E:
db   'DS:', 7

da3F:
db   'AAS', 7

da3X:
db   daSpace, 0, 7 
dw   daX0, daX1, daX2, daX3, daX4, daX5 

daADD:
db   'ADD', 0, 80h
dw   da3X 

daXOR:
db   'X' 

daOR:
db   'OR', 0, 80h 
dw   da3X 

daADC:
db   'ADC', 0, 80h
dw   da3X 

daSBB:
db   'SBB', 0, 80h
dw   da3X 

daAND:
db   'AND', 0, 80h
dw   da3X 

daSUB:
db   'SUB', 0, 80h
dw   da3X 

daCMP:
db   'CMP', 0, 80h 
dw   da3X 

daX0:
daX1:
db   0, 1
dw   daCall+daModRM, daCall+daModRM
db   ',', 0, 1
dw   da2R8, da2R16

daX2:
daX3:
db   0, 1
dw   daCall+da2R8, daCall+da2R16
db   ',', 0, 1
dw   daModRM, daModRM

daX4:
db   'AL,'
da1Imm8: 
db   1, 0FFh, 7

daX5:
db   'AX,'
da1Imm16: 
db   2, 0FFh, 1, 0FFh, 7

da40:
db   'INC', daSpace, 0, 1
dw   da1R16, da1R16

da48:
db   'DEC', daSpace, 0, 1
dw   da1R16, da1R16 

da50:
db   'PUSH', daSpace, 0, 1
dw   da1R16, da1R16

da58:
db   'POP', daSpace, 0, 1
dw   da1R16, da1R16
 
da60:
db   0, 7
dw   daPUSHA, daPOPA, daBOUND, daXX, daXX, daXX, daXX, daXX 

daPUSHA:
db   'PUSHA', 7

daPOPA:
db   'POPA', 7

daBOUND:
db   1, 0C0h
dw   daBOUND_OK, daBOUND_OK, daBOUND_OK, daXX2 

daBOUND_OK: 
db   'BOUND', daSpace, 0, 1
dw   daCall+da2R16, daCall+da2R16
db   ',', 0, 1
dw   daModRM 

da68:
db   0, 7
dw   daPUSHi16, daIMULi16, daPUSHi8, daIMULi8
dw   daCall+daINS, daCall+daINS, daCall+daOUTS, daCall+daOUTS
db   0, 80h
dw   daBW 

daPUSHi16:
db   'PUSH', daSpace, 0, 80h
dw   da1Imm16 

daIMULi16:
db   'IMUL', daSpace, 0, 1
dw   daCall+da2R16, daCall+da2R16
db   ',', 0, 80h 
dw   daModRMImm 

daPUSHi8:
db   'PUSH', daSpace, 1, 0FFh, 7

daIMULi8:
db   'IMUL', daSpace, 0, 1
dw   daCall+da2R16, daCall+da2R16 
db   ',', 0, 1 
dw   daCall+daModRM, daCall+daModRM
db   ',', 0, 80h
dw   daImm8SX

daINS:
db   'INS', 7

daOUTS:
db   'OUTS', 7

da70: 
da78:
db   'J', 0, 1 
dw   daCall+daJumps, daCall+daJumps
db   daSpace, 1, 0FDh, 7

daJumps:
db   0, 0Fh
dw   daJO, daJNO, daJB, daJNB, daJZ, daJNZ, daJBE, daJA
dw   daJS, daJNS, daJP, daJNP, daJL, daJGE, daJLE, daJG 

daJNO: 
db   'N' 

daJO:
db   'O', 7

daJNB:
db   'N' 

daJB:
daB: 
db   'B', 7

daJNZ:
db   'N' 

daJZ:
db   'Z', 7

daJBE:
db   'BE', 7

da37:
db   'AA' 

daJA:
db   'A', 7

daJNS:
db   'N' 

daJS:
db   'S', 7

daJNP: 
db   'N' 

daJP:
db   'P', 7

daROL:
db   'RO' 

daJL:
db   'L', 7

daJGE:
db   'GE', 7

daJLE:
db   'LE', 7

daNEG:
db   'NE' 

daJG:
db   'G', 7

da80:
db   0, 6 
dw   daArOp1, daArOp2, daTEST, daXCHG  

daArOp1:
db   1, 38h
dw   daCall+daADDa, daCall+daORa, daCall+daADCa, daCall+daSBBa
dw   daCall+daANDa, daCall+daSUBa, daCall+daXORa, daCall+daCMPa 
db   daSpace, 0, 8 
dw   daModRMImm

daArOp2:
db   1, 38h
dw   daCall+daADDa, daCall+daORa, daCall+daADCa, daCall+daSBBa
dw   daCall+daANDa, daCall+daSUBa, daCall+daXORa, daCall+daCMPa
db   daSpace, 0, 1
dw   daCall+daModRM, daCall+daModRM
db   ',', 0, 8
dw   daImm8SX

daADDa:
db   'ADD', 7

daXORa:
db   'X' 

daORa:
db   'OR', 7

daADCa:
db   'ADC', 7

daSBBa:
db   'SBB', 7 
 
daANDa:
db   'AND', 7

daSUBa:
db   'SUB', 7 

daCMPa:
db   'CMP', 7

daTEST:
db   'TEST', daSpace, 0, 1
dw   daCall+daModRM, daCall+daModRM
db   ',', 0, 1
dw   da2R8, da2R16 

daXCHG:
db   'XCHG', daSpace, 0, 1
dw   daCall+da2R8, daCall+da2R16
db   ',', 0, 8 
dw   daModRM
 
da88:
db   0, 7
dw   daMOVtoRM, daMOVtoRM, daMOVfromRM, daMOVfromRM
dw   daMOVfromSeg, daLEA, daMOVtoSeg, daPOPRM 

daMOVtoRM:
db   'MOV', daSpace, 0, 1
dw   daCall+daModRM, daCall+daModRM
db   ',', 0, 1
dw   da2R8, da2R16

daMOVfromRM:
db   'MOV', daSpace, 0, 1
dw   daCall+da2R8, daCall+da2R16
db   ',', 0, 1
dw   daModRM, daModRM 

daMOVfromSeg:
db   1, 20h
dw   daMOVfromSeg_OK, daXX2 

daMOVfromSeg_OK:
db   'MOV', daSpace, 1, 0C0h 
dw   daCall+daModRM, daCall+daModRM, daCall+daModRM, daCall+daRMC0w 
db   ',', 0, 1
dw   daSeg 

daLEA:
db   1, 0C0h
dw   daLEA_OK, daLEA_OK, daLEA_OK, daXX2 

daLEA_OK:
db   'LEA', daSpace, 0, 1
dw   daCall+da2R16, daCall+da2R16
db   ',', 0, 2
dw   daModRM 

daMOVtoSeg:
db   1, 20h
dw   daMOVtoSeg_OK, daXX2 

daMOVtoSeg_OK:
db   'MOV', daSpace, 0, 1 
dw   daCall+daSeg, daCall+daSeg 
db   ',', 1, 0C0h 
dw   daModRM, daModRM, daModRM, daRMC0w 

daPOPRM: 
db   'POP', daSpace, 0, 8 
dw   daModRM 
 
da90:
db   0, 3 
dw   daNOP_CHECK, daXCHGAX, daXCHGAX, daXCHGAX

daNOP_CHECK:
db   0, 4 
dw   daNOP, daXCHGAX

daNOP:
db   'NOP', 7 

daXCHGAX:
db   'XCHG', daSpace, 'AX,', 0, 20h
dw   da1R16 
 
da98:
db   0, 7
dw   daCBW, daCWD, daCALLF, daWAIT
dw   daPUSHF, daPOPF, daSAHF, daLAHF

daCBW:
db   'CB'

daW: 
db   'W', 7

daCWD:
db   'CWD', 7

daCALLF:
db   'CALL'
daPTR: 
db   daSpace, 4, 0FFh, 3, 0FFh, ':', 0, 1
dw   da1Imm16 

daWAIT:
db   'WAIT', 7

daPUSHF:
db   'PUSHF', 7

daPOPF:
db   'POPF', 7

daSAHF:
db   'SAHF', 7

daLAHF:
db   'LAHF', 7
 
daA0: 
db   0, 7 
dw   daMOVALm, daMOVAXm, daMOVmAL, daMOVmAX
dw   daCall+daMOVS, daCall+daMOVS, daCall+daCMPS, daCall+daCMPS

daBW: 
db   0, 1
dw   daB, daW 

daA8:
db   0, 6 
dw   daTESTA, daCall+daSTOS, daCall+daLODS, daCall+daSCAS
db   0, 10h 
dw   daBW 

daMOVALm:
db   'MOV', daSpace, 'AL,[', 2, 0FFh, 1, 0FFh, ']', 7

daMOVAXm:
db   'MOV', daSpace, 'AX,[', 2, 0FFh, 1, 0FFh, ']', 7

daMOVmAL:
db   'MOV', daSpace, '[', 2, 0FFh, 1, 0FFh, '],AL', 7

daMOVmAX:
db   'MOV', daSpace, '[', 2, 0FFh, 1, 0FFh, '],AX', 7

daMOVS:
db   'MOVS', 7

daCMPS:
db   'CMPS', 7

daTESTA:
db   'TEST', daSpace, 'A', 0, 1
dw   daTESTAL, daTESTAX

daTESTAL: 
db   'L,', 1, 0FFh, 7

daTESTAX:
db   'X,', 0, 2
dw   da1Imm16 

daSTOS:
db   'STOS', 7

daLODS:
db   'LODS', 7

daSCAS:
db   'SCAS', 7

daB0:
daB8: 
db   'MOV', daSpace, 0, 8
dw   daCall+da1R8, daCall+da1R16
db   ',', 0, 8
dw   da1Imm8, da1Imm16
 
daC0: 
db   0, 6 
dw   daShfOp, daRETN, daLXS, daMOVmi

daShfOp:
db   1, 38h
dw   daCall+daROL, daCall+daROR, daCall+daRCL, daCall+daRCR
dw   daCall+daSHL, daCall+daSHR, daXX2, daCall+daSAR
db   daSpace, 0, 1
dw   daCall+daModRM, daCall+daModRM
db   ',', 0, 10h
dw   daShf186, daShf086 

daShf186 = daImm8

daShf086:
db   0, 2
dw   daShf1, daShfCL

daShf1:
db   '1', 7

daShfCL = daCL 

daROR:
db   'ROR', 7

daRCR:
db   'RCR', 7

daSHL:
db   'SHL', 7

daSHR:
db   'SHR', 7

daSAR:
db   'SAR', 7

daIRET:
db   'I' 

daRETN:
db   'RET', 0, 1
dw   daRETNi, daDone 

daRETNi:
db   daSpace, 0, 8
dw   da1Imm16 

daLXS:
db   1, 0C0h
dw   daLXS_OK, daLXS_OK, daLXS_OK, daXX2 

daLXS_OK:
db   'L', 0, 1
dw   daCall+daLES, daCall+daLDS
db   'S', daSpace, 0, 1
dw   daCall+da2R16, daCall+da2R16
db   ',', 0, 8
dw   daModRM 

daLES:
db   'E', 7

daLDS:
db   'D', 7

daMOVmi:
db   1, 18h
dw   daMOVmi_CHECK, daXX2, daXX2, daXX2 

daMOVmi_CHECK:
db   1, 20h
dw   daMOVmi_OK, daXX2 

daMOVmi_OK: 
db   'MOV', daSpace, 0, 8 
dw   daModRMImm  

daC8:
db   0, 7 
dw   daENTER, daLEAVE, daRETFi, daRETF, daINT3, daINT, daINTO, daIRET 

daENTER:
db   'ENTER', daSpace, 2, 0FFh, 1, 0FFh, ',', 3, 0FFh, 7

daLEAVE:
db   'LEAVE', 7

daRETFi:
db   'RETF', daSpace, 0, 1
dw   da1Imm16 

daRETF:
db   'RETF', 7

daINT3:
db   'INT', daSpace, '3', 7

daINT:
db   'INT', daSpace, 1, 0FFh, 7

daINTO:
db   'INTO', 7 

daD0:
db   0, 4
dw   daShfOp, daD4

daD4:
db   0, 3
dw   daAAM, daAAD, daSETALC, daXLAT

daAAM:
db   'AAM', daSpace, 1, 0FFh, 7

daAAD:
db   'AAD', daSpace, 1, 0FFh, 7

daSETALC:
db   'SETALC', 7

daXLAT:
db   'XLAT', 7
 
daD8 = daXX

daE0: 
daE8:
daF0:
daF8: 
db   0, 1Fh
dw   daLOOPNZ, daLOOPZ, daLOOP, daJCXZ
dw   daINAL, daINAX, daOUTAL, daOUTAX
dw   daCALLN, daJMPN, daJMPF, daJMPS
dw   daINALDX, daINAXDX, daOUTDXAL, daOUTDXAX
dw   daLOCK, daXX, daREP, daREPZ
dw   daHLT, daCMC, daGrp1, daGrp1
dw   daCLC, daSTC, daCLI, daSTI
dw   daCLD, daSTD, daGrp2, daGrp3 

daLOOPNZ:
db   'LOOPNZ', daSpace, 1, 0FDh, 7

daLOOPZ:
db   'LOOPZ', daSpace, 1, 0FDh, 7

daLOOP:
db   'LOOP', daSpace, 1, 0FDh, 7

daJCXZ:
db   'JCXZ', daSpace, 1, 0FDh, 7

daINAL:
db   'IN', daSpace, 'AL,', 1, 0FFh, 7

daINAX:
db   'IN', daSpace, 'AX,', 1, 0FFh, 7

daOUTAL:
db   'OUT', daSpace, 1, 0FFh, ',AL', 7

daOUTAX:
db   'OUT', daSpace, 1, 0FFh, ',AX', 7

daCALLN:
db   'CALL', daSpace, 1, 0FCh, 7

daJMPN:
db   'JMP', daSpace, 1, 0FCh, 7

daJMPF:
db   'JMP', 0, 1
dw   daPTR 

daJMPS:
db   'JMP', daSpace, 1, 0FDh, 7

daINAXDX: 
db   'IN', daSpace, 'AX,DX', 7

daLOCK:
db   'LOCK', 7

daREP:
db   'REP', 7

daREPZ:
db   'REPZ', 7 

daHLT:
db   'HLT', 7

daCMC:
db   'CMC', 7

daGrp1:
db   1, 38h
dw   daTESTRMI, daXX2, daCall+daNOT, daCall+daNEG
dw   daCall+daMUL, daCall+daIMUL, daCall+daDIV, daCall+daIDIV
db   daSpace, 0, 8
dw   daModRM 

daTESTRMI:
db   'TEST', daSpace, 0, 8 
dw   daModRMImm

daNOT:
db   'NOT', 7

daIMUL:
db   'I' 

daMUL:
db   'MUL', 7

daIDIV:
db   'I' 

daDIV:
db   'DIV', 7

daCLC:
db   'CLC', 7

daSTC:
db   'STC', 7

daCLI:
db   'CLI', 7
 
daSTI:
db   'STI', 7

daCLD:
db   'CLD', 7

daSTD:
db   'STD', 7

daGrp2:
db   1, 38h
dw   daINCb, daDECb, daXX2, daXX2
dw   daXX2, daXX2, daXX2, daXX2 

daINCb:
db   'INC', daSpace, 1, 20h 
dw   daModRM

daDECb:
db   'DEC', daSpace, 1, 20h
dw   daModRM

daGrp3:
db   1, 38h
dw   daINCw, daDECw, daCALLw, daCALLd
dw   daJMPw, daJMPd, daPUSH, daXX2  

daINCw = daINCb

daDECw = daDECb 

daCALLw:
db   'CALL', daSpace, 1, 20h
dw   daModRM

daCALLd = daCALLw

daJMPw:
db   'JMP', daSpace, 1, 10h 
dw   daModRM

daJMPd = daJMPw

daPUSH: 
db   'PUSH', daSpace, 1, 8 
dw   daModRM

end

Back to other source code snippets and frameworks placed in the public domain.

people/solar/software/public-domain-source-code/intel-80186-disassembler.1257518225.txt · Last modified: 2009/11/06 15:37 by solar
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate to DokuWiki Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Powered by OpenVZ Powered by Openwall GNU/*/Linux