📄 dis.asm
字号:
page 78,132
title Disassembly command
ActionBits = 4
ActionMask = (1 shl ActionBits) - 1
SubIndexMask = not ActionMask
.sall
dm MACRO string
$StrSize sizestr <&string>
$FirstStr substr <&string>,1,$StrSize-1
$LastChar substr <&string>,$StrSize
% db "&$FirstStr","&$LastChar"+80H
ENDM
DefAction MACRO ActName
ActName&Ind = ($ - Actions)/2
dw ActName
ENDM
NewAction MACRO ActName
CurActInd = ActName&Ind
ActName&Ops label word
pos = 0
ENDM
DefMne MACRO mnemonic
Strings segment
mnemonic&Op label byte
dm mnemonic
Strings ends
.code
dw offset DGroup:mnemonic&Op
ENDM
OpInd MACRO opcode,MneInd
CurPos = $
.erre CurActInd LE ActionMask
org OpGroup+opcode
db CurActInd + MneInd * (ActionMask+1)
org CurPos
ENDM
DefOp MACRO opcode,mnemonic,count
IFB <count>
cnt = 1
ELSE
cnt = count
ENDIF
IRP opc,<opcode>
i = 0
REPT cnt
OpInd opc+i,pos
i = i+1
ENDM ;;REPT
ENDM ;;IRP
IFNB <mnemonic>
char1 substr <mnemonic>,1,1
% IFIDN <char1>,<_>
Lchar substr <mnemonic>,2
OpNam catstr Lchar,<Op>
dw offset DGroup:OpNam
ELSE
DefMne mnemonic
ENDIF ;;IFIDN
ENDIF ;;IFNB mnemonic
pos = pos + 1
ENDM
DefSpc MACRO opcode,action,count
IFB <count>
cnt = 1
ELSE
cnt = count
ENDIF
IRP opc,<opcode>
i = 0
REPT cnt
OpInd opc+i,pos
i = i+1
ENDM ;;REPT
ENDM ;;IRP
dw offset DGroup:action
pos = pos + 1
ENDM
.model small
.code
.data
Strings segment byte public
Strings ends
DGroup group _DATA,Strings
.data
extrn BxSave:word, BpSave:word, SiSave:word, DiSave:word, CsSave:word
fAddr32 = 1
fData32 = 2
FlagWord dw 0
Prefix equ byte ptr FlagWord
Override equ byte ptr FlagWord+1
DisBuf db 80 dup(?)
DefDis dw 0,0
.code
public UnAssemble,DisLine
extrn Default:near, PrintMes:near, OutCh:near, OutSi:near
tByteReg label word
db "al"
db "cl"
db "dl"
db "bl"
db "ah"
db "ch"
db "dh"
db "bh"
tWordReg label word
db "ax"
db "cx"
db "dx"
db "bx"
db "sp"
db "bp"
db "si"
db "di"
tSegReg label word
db "es"
db "cs"
db "ss"
db "ds"
db "fs"
db "gs"
tShiftOps label word
DefMne rol
DefMne ror
DefMne rcl
DefMne rcr
DefMne shl
DefMne shr
DefMne sal
DefMne sar
tGrp3Ops label word
dw offset DGroup:TestOp
dw offset DGroup:TestOp
DefMne not
DefMne neg
DefMne mul
DefMne imul
DefMne div
DefMne idiv
tGrp4Ops label word
dw offset DGroup:IncOp
dw offset DGroup:DecOp
dw offset DGroup:CallOp
dw offset DGroup:CallOp
dw offset DGroup:JmpOp
dw offset DGroup:JmpOp
dw offset DGroup:PushOp
dw offset DGroup:???Op
XlatOp: dm xlat
IntOp: dm int
EscOp: dm esc
ByteMsg: dm byte
WordMsg: dm word
DwordMsg: dm dword
PtrMsg: dm < ptr >
AddrBx = 1
AddrBp = 2
AddrSi = 4
AddrDi = 8
AddrPlus= 10H
AddrMod16 label byte
db AddrBx+AddrSi+AddrPlus
db AddrBx+AddrDi+AddrPlus
db AddrBp+AddrSi+AddrPlus
db AddrBp+AddrDi+AddrPlus
db AddrSi
db AddrDi
db AddrBp
db AddrBx
OpGroup db 100H dup(0) ;Allocate opcode lookup table
Actions label word
DefAction OneByte
DefAction OneByte2
DefAction Arith
DefAction OneReg
DefAction CondJump
DefAction CondJump2
DefAction SegPush
DefAction String
DefAction ArithIm
DefAction Jump
DefAction Special
DefAction RepLock
DefAction InOut
DefAction AamAad
DefAction LdPointer
DefAction RetImm
NewAction OneByte ;Start data for action routine
DefOp 0F1H,??? ;Must be first!!
DefOp 027H,daa
DefOp 02FH,das
DefOp 037H,aaa
DefOp 03FH,aas
DefOp 060H,pusha
DefOp 061H,popa
DefOp 090H,nop
DefOp 098H,cbw
DefOp 099H,cwd
DefOp 09BH,wait
DefOp 09CH,pushf
DefOp 09DH,popf
DefOp 09EH,sahf
DefOp 09FH,lahf
DefOp 0C3H,ret
NewAction OneByte2
DefOp 0C9H,leave
DefOp 0CBH,retf
DefOp 0CEH,into
DefOp 0CFH,iret
DefOp 0F4H,hlt
DefOp 0F5H,cmc
DefOp 0F8H,clc
DefOp 0F9H,stc
DefOp 0FAH,cli
DefOp 0FBH,sti
DefOp 0FCH,cld
DefOp 0FDH,std
NewAction Arith
;WARNING! this order is needed for ArithIm and Group1 decoding!
DefOp 00H,add,4
DefOp 08H,or,4
DefOp 10H,adc,4
DefOp 18H,sbb,4
DefOp 20H,and,4
DefOp 28H,sub,4
DefOp 30H,xor,4
DefOp 38H,cmp,4
DefOp 84H,test,2
DefOp 86H,xchg,2
DefOp 88H,mov,4
NewAction OneReg
DefOp 40H,inc,8
DefOp 48H,dec,8
DefOp 50H,push,8
DefOp 58H,pop,8
NewAction CondJump
DefOp 70H,jo
DefOp 71H,jno
DefOp 72H,jc
DefOp 73H,jnc
DefOp 74H,jz
DefOp 75H,jnz
DefOp 76H,jbe
DefOp 77H,ja
DefOp 78H,js
DefOp 79H,jns
DefOp 7AH,jpe
DefOp 7BH,jpo
DefOp 7CH,jl
DefOp 7DH,jge
DefOp 7EH,jle
DefOp 7FH,jg
NewAction CondJump2
DefOp 0E0H,loopne
DefOp 0E1H,loope
DefOp 0E2H,loop
DefOp 0E3H,jcxz
DefOp 0EBH,jmp
NewAction SegPush
DefOp <06H,0EH,16H,1EH>,_push
DefOp <07H,17H,1FH>,_pop
NewAction String
DefOp 06CH,ins,2
DefOp 06EH,outs,2
DefOp 0A4H,movs,2
DefOp 0A6H,cmps,2
DefOp 0AAH,stos,2
DefOp 0ACH,lods,2
DefOp 0AEH,scas,2
NewAction ArithIm
DefOp 04H,,2
DefOp 0CH,,2
DefOp 14H,,2
DefOp 1CH,,2
DefOp 24H,,2
DefOp 2CH,,2
DefOp 34H,,2
DefOp 3CH,,2
DefOp 0A8H,,2
NewAction Jump
DefOp <9AH,0E8H>,call
DefOp <0E9H,0EAH>,_jmp
NewAction Special
DefSpc 0B0H,MoveIm,16
DefSpc 91H,XchgAx,7
DefSpc <26H,2EH,36H,3EH,64H,65H>,SegOver
DefSpc 0D7H,XlatInst
DefSpc 0A0H,MovAcc,4
DefSpc 0C6H,MovImMem,2
DefSpc <8CH,8EH>,SegMov
DefSpc 8FH,PopMem
DefSpc 0CCH,Interrupt,2
DefSpc 0D8H,Coprocessor,8
DefSpc 80H,Group1,4
DefSpc 0C0H,Group2,2
DefSpc 0D0H,Group2,4
DefSpc 0F6H,Group3,2
DefSpc 0FEH,Group4,2
NewAction RepLock
DefOp 0F0H,lock
DefOp 0F2H,repne
DefOp 0F3H,repe
NewAction InOut
DefOp <0E4H,0ECH>,in,2
DefOp <0E6H,0EEH>,out,2
NewAction AamAad
DefOp 0D4H,aam
DefOp 0D5H,aad
NewAction LdPointer
DefOp 62H,bound
DefOp 8DH,lea
DefOp 0C4H,les
DefOp 0C5H,lds
NewAction RetImm
DefOp 0C2H,_ret
DefOp 0CAH,_retf
assume ds:nothing,es:nothing,ss:DGroup
UnAssemble:
mov bp,[CsSave] ;Default segment is cs
mov cx,8
mov di,offset DGroup:DefDis
call Default ;Get range to disassemble
mov ds,ax ;Set segment
mov si,dx ;SI has displacement in segment
LineDis:
push cx
call DisLine
pop cx
loop LineDis
ret
DisLine:
;Display disassembly of line at ds:si
call OutSi
mov al,9 ;Tab char
call OutCh
mov di,offset DGroup:DisBuf
call DisAssemble
mov ax,13+(10+80H)*100H ;Add Cr/Lf terminator
stosw
mov word ptr [DefDis],si
mov word ptr [DefDis+2],ds ;Remember last addrss as default
push ds
push si
push cs
pop ds
mov si,offset DGroup:DisBuf
call PrintMes
pop si
pop ds
ret
DisAssemble:
;ds:si points to code
;es:di points to destination buffer
mov [FlagWord],0
DisNext:
lodsb ;Get first code byte
mov ah,al ;Save a copy
mov bx,offset DGroup:OpGroup
xlat OpGroup
mov bl,al
and bx,ActionMask ;Low 4 bits have action index
shl bx,1
mov dx,[bx].Actions ;Get address of action routine
mov bl,al
and bl,SubIndexMask ;Mask to mnemonic index
mov cl,ActionBits - 1
shr bx,cl ;Now a word index
jmp dx
Special:
;Dispatch for those opcodes with only one mnemonic per action
jmp [bx].SpecialOps
RepLock:
mov bx,[bx].RepLockOps
call CopyMsgTab
jmp DisNext
SegOver:
mov al,ah
cmp al,60H ;FS/GS?
jae SegInPlace
mov cl,3
shr al,cl ;Bring seg no. down to low end
and al,3
SegInPlace:
and al,7
inc ax
mov [Override],al
jmp DisNext
SegMov:
mov bx,offset DGroup:MovOp
call CopyMsgTab
lodsb ;Get R/M byte
mov bl,al
and bx,7*8 ;Mask to segment reg
shr bx,1
shr bx,1
mov bx,[bx].tSegReg
test ah,2 ;To segment reg?
mov ah,1 ;Ensure word size
jnz ToSeg
push bx ;Save segment reg
call ModRm
mov al,","
stosb
pop ax ;Get seg reg back
stosw
ret
ToSeg:
xchg bx,ax ;Seg reg to ax
stosw
mov al,","
stosb
xchg bx,ax ;Restore R/M byte
jmp ModRm
PopMem:
mov bx,offset DGroup:PopOp
call CopyMsgTab
lodsb ;Get R/M byte
jmp ModRm
MoveIm:
mov bx,offset DGroup:MovOp
call CopyMsgTab
mov al,ah
mov cl,3
shr ah,cl ;Move bit 3 down to bit 0
jmp short RegImm
MovAcc:
mov bx,offset DGroup:MovOp
call CopyMsgTab
test ah,2 ;To accumulator?
jz ToAcc
push ax
mov al,"["
stosb
call WordImm
mov ax,",]"
stosw
pop ax ;Get byte/word flag back
xor al,al ;Use al/ax
jmp ShowReg
ToAcc:
xor al,al ;Use al/ax
call ShowReg
mov ax,"[,"
stosw
call WordImm
mov al,"]"
stosb
ret
ArithIm:
mov bx,[bx].ArithOps
call CopyMsgTab
mov al,0 ;Select al, ax, or eax
RegImm:
call ShowReg
ShowImm:
mov al,","
stosb
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -