📄 int386.asm
字号:
JZ ABOUTCR
CMP EAX,21H
JZ ABOUTDR
CMP EAX,24H
JZ ABOUTTR
JMP NOTRECOVER
ABOUTCR:
MOV ECX,0H
MOV EDX,1FH
JMP RUNINSTRUCTION
ABOUTDR:
MOV ECX,0H
MOV EDX,3FH
JMP RUNINSTRUCTION
ABOUTTR:
MOV ECX,30H
MOV EDX,3FH
RUNINSTRUCTION:
MOV EAX,ES:[EBX]
SHR EAX,16
AND EAX,03FH
CMP EAX,ECX
JB NOTRECOVER
CMP EAX,EDX
JA NOTRECOVER
MOV AX,SEL_ISR ;The alias of ISR
MOV GS,AX
MOV EAX,ES:[EBX]
MOV BYTE PTR GS:THEINSTRUCTION,AL
SHR EAX,8
MOV BYTE PTR GS:THEINSTRUCTION+1,AL
SHR EAX,8
MOV BYTE PTR GS:THEINSTRUCTION+2,AL
MOV EAX,[ESP+30H+4]
ADD EAX,3
MOV [ESP+30H+4],EAX
POP GS
POP FS
POP ES
POPAD
THEINSTRUCTION LABEL
DB 0,0,0
ADD ESP,8
IRETD
SKIPINSTRUCTION:
MOV EAX,[ESP+30H+4]
ADD EAX,3
MOV [ESP+30H+4],EAX
POP GS
POP FS
POP ES
POPAD
ADD ESP,8
IRETD
;****************************************************************************
;* here handle the I/O instruction,Analyse *
;****************************************************************************
NOTMOV:
CMP BYTE PTR FS:EXEFLAG,0H
JZ EMULATEDOG ;IS 1, analyse the soft dog
CMP EAX,0ECH ;IN AL,DX
JZ INAL_DX
CMP EAX,0EDH ;IN AX,DX
JZ INAX_DX
CMP EAX,0E4H ;IN AL,XX
JZ INAL_XX
CMP EAX,0E5H ;IN AX,XX
JZ INAX_XX
CMP EAX,0EEH ;OUT DX,AL
JZ OUTDX_AL
CMP EAX,0EFH ;OUT DX,AX
JZ OUTDX_AX
CMP EAX,0E6H ;OUT XX,AL
JZ OUTXX_AL
CMP EAX,0E7H ;OUT XX,AX
JZ OUTXX_AX
CMP EAX,06CH ;INSB
JZ ABOUTINSB
CMP EAX,06DH ;INSW
JZ ABOUTINSW
CMP EAX,6EH ;OUTSB
JZ ABOUTOUTSB
CMP EAX,6FH ;OUTSW
JZ ABOUTOUTSW
CMP EAX,0F3H ;REP
JZ ABOUTREP
JMP NOTRECOVER
INAL_DX:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
IN AL,DX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],0 ;in byte
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV BYTE PTR ES:[ESI+EBX+9],AL ;value
ADD EBX,4
MOV ES:[ESI+2],EBX ;counter
MOV BYTE PTR [ESP+28H],AL
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
INAX_DX:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
IN AX,DX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],1 ;in word
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV WORD PTR ES:[ESI+EBX+9],AX ;value
ADD EBX,5
MOV ES:[ESI+2],EBX ;counter
MOV WORD PTR [ESP+28H],AX
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
INAL_XX:
MOV EDX,ES:[EBX] ;CURRENT INSTRUCTION
SHR EDX,8
AND EDX,0FFH
MOV AX,SEL_UDATA
MOV GS,AX
IN AL,DX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],0 ;in byte
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV BYTE PTR ES:[ESI+EBX+9],AL ;value
ADD EBX,4
MOV ES:[ESI+2],EBX ;counter
MOV BYTE PTR [ESP+28H],AL
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
INAX_XX:
MOV EDX,ES:[EBX] ;CURRENT INSTRUCTION
SHR EDX,8
AND EDX,0FFH
MOV AX,SEL_UDATA
MOV GS,AX
IN AX,DX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],1 ;in word
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV WORD PTR ES:[ESI+EBX+9],AX ;value
ADD EBX,5
MOV ES:[ESI+2],EBX ;counter
MOV WORD PTR [ESP+28H],AX
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
OUTDX_AL:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
MOV AL,BYTE PTR [ESP+28H] ;OLD EAX
OUT DX,AL
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],10H ;out byte
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV BYTE PTR ES:[ESI+EBX+9],AL ;value
ADD EBX,4
MOV ES:[ESI+2],EBX ;counter
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
OUTDX_AX:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
MOV AX,WORD PTR [ESP+28H] ;OLD EAX
OUT DX,AX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],11H ;out word
MOV WORD PTR ES:[ESI+EBX+7],DX ;portno
MOV WORD PTR ES:[ESI+EBX+9],AX ;value
ADD EBX,5
MOV ES:[ESI+2],EBX ;counter
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
OUTXX_AL:
MOV EDX,ES:[EBX] ;CURRENT INSTRUCTION
SHR EDX,8
AND EDX,0FFH
MOV AX,SEL_UDATA
MOV GS,AX
MOV AL,BYTE PTR [ESP+28H] ;OLD EAX
OUT DX,AL
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],10H ;word byte
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV BYTE PTR ES:[ESI+EBX+9],AL ;value
ADD EBX,4
MOV ES:[ESI+2],EBX
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
OUTXX_AX:
MOV EDX,ES:[EBX] ;CURRENT INSTRUCTION
SHR EDX,8
AND EDX,0FFH
MOV AX,SEL_UDATA
MOV GS,AX
MOV AX,WORD PTR [ESP+28H] ;OLD EAX
OUT DX,AX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],11H ;out word
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV WORD PTR ES:[ESI+EBX+9],AX ;value
ADD EBX,5
MOV ES:[ESI+2],EBX
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
ABOUTINSB:
MOV EAX,[ESP+44H+4] ;OLD ES
SHL EAX,4
MOV EDI,[ESP+0CH] ;OLD EDI
ADD EDI,EAX
MOV EDX,[ESP+20H] ;OLD DX
CLD
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ NOTCHANGE1
STD
INSB
MOV CL,BYTE PTR ES:[EDI+1]
MOV EAX,[ESP+0CH]
DEC EAX
AND EAX,0FFFFH
MOV [ESP+0CH],EAX
JMP INSBOVER
NOTCHANGE1:
INSB
MOV CL,BYTE PTR ES:[EDI-1]
MOV EAX,[ESP+0CH]
INC EAX
AND EAX,0FFFFH
MOV [ESP+0CH],EAX
INSBOVER:
MOV AX,SEL_UDATA
MOV GS,AX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],0H ;in byte
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV BYTE PTR ES:[ESI+EBX+9],CL ;value
ADD EBX,4
MOV ES:[ESI+2],EBX
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
ABOUTINSW:
MOV EAX,[ESP+44H+4] ;OLD ES
SHL EAX,4
MOV EDI,[ESP+0CH] ;OLD EDI
ADD EDI,EAX
MOV EDX,[ESP+20H] ;OLD DX
CLD
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ NOTCHANGE2
STD
INSW
MOV CX,WORD PTR ES:[EDI+2]
MOV EAX,[ESP+0CH]
SUB EAX,2
MOV [ESP+0CH],EAX
JMP INSWOVER
NOTCHANGE2:
INSW
MOV CX,WORD PTR ES:[EDI-2]
MOV EAX,[ESP+0CH]
ADD EAX,2
MOV [ESP+0CH],EAX
INSWOVER:
MOV AX,SEL_UDATA
MOV GS,AX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+4],1H ;in word
MOV WORD PTR ES:[ESI+EBX+5],DX ;port no
MOV WORD PTR ES:[ESI+EBX+7],CX ;value
ADD EBX,5
MOV ES:[ESI+2],EBX
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP IOINSTRUCTIONOVER
ABOUTOUTSB:
MOV EAX,[ESP+48H+4] ;OLD DS
SHL EAX,4
MOV ESI,[ESP+10H] ;OLD ESI
ADD ESI,EAX
MOV EDX,[ESP+20H] ;OLD DX
CLD
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ NOTCHANGE3
STD
OUTSB
MOV CL,BYTE PTR ES:[ESI+1]
MOV EAX,[ESP+0CH]
DEC EAX
AND EAX,0FFFFH
MOV [ESP+0CH],EAX
JMP OUTSBOVER
NOTCHANGE3:
OUTSB
MOV CL,BYTE PTR ES:[ESI-1]
MOV EAX,[ESP+0CH]
INC EAX
AND EAX,0FFFFH
MOV [ESP+0CH],EAX
OUTSBOVER:
MOV AX,SEL_UDATA
MOV GS,AX
MOV ESI,GS:PORTDATAADDR
MOV EBX,ES:[ESI+2]
MOV BYTE PTR ES:[ESI+EBX+6],10H ;out byte
MOV WORD PTR ES:[ESI+EBX+7],DX ;port no
MOV BYTE PTR ES:[ESI+EBX+9],CL ;value
ADD EBX,4
MOV ES:[ESI+2],EBX
MOV EAX,[ESP+30H+4]
INC EAX
MOV [ESP+30H+4],EAX ;next instruction
JMP IOINSTRUCTIONOVER
ABOUTOUTSW:
MOV EAX,[ESP+48H+4] ;OLD DS
SHL EAX,4
MOV ESI,[ESP+10H] ;OLD ESI
ADD ESI,EAX
MOV EDX,[ESP+20H] ;OLD DX
CLD
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ NOTCHANGE4
STD
OUTSW
MOV CX,WORD PTR ES:[ESI+2]
MOV EAX,[ESP+0CH]
SUB EAX,2
AND EAX,0FFFFH
MOV [ESP+0CH],EAX
JMP OUTSWOVER
NOTCHANGE4:
OUTSW
MOV CX,WORD PTR ES:[ESI-2]
MOV EAX,[ESP+0CH]
ADD EAX,2
AND EAX,0FFFFH
MOV [ESP+0CH],EAX
OUTSWOVER:
MOV AX,SEL_UDATA
MOV GS,AX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -