📄 int386.asm
字号:
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],CX ;value
ADD EBX,5
MOV ES:[ESI+2],EBX
MOV EAX,[ESP+30H+4]
INC EAX
MOV [ESP+30H+4],EAX ;next instruction
JMP IOINSTRUCTIONOVER
ABOUTREP:
MOV EAX,GS:[EBX]
SHR EAX,8
AND EAX,0FFH
CMP EAX,6CH
JZ ABOUTREPINSB
CMP EAX,6DH
JZ ABOUTREPINSW
CMP EAX,6EH
JZ ABOUTREPOUTSB
CMP EAX,6FH
JZ ABOUTREPOUTSW
JMP NOTRECOVER
ABOUTREPINSB:
ABOUTREPINSW:
ABOUTREPOUTSB:
ABOUTREPOUTSW:
JMP IOINSTRUCTIONOVER
IOINSTRUCTIONOVER:
POP GS
POP FS
POP ES
POPAD
ADD ESP,8
IRETD
;****************************************************************************
;* here handle the I/O instruction,Emulation *
;****************************************************************************
EMULATEDOG:
CMP EAX,0ECH ;IN AL,DX
JZ EMINAL_DX
CMP EAX,0EDH ;IN AX,DX
JZ EMINAX_DX
CMP EAX,0E4H ;IN AL,XX
JZ EMINAL_XX
CMP EAX,0E5H ;IN AX,XX
JZ EMINAX_XX
CMP EAX,0EEH ;OUT DX,AL
JZ EMOUTDX_AL
CMP EAX,0EFH ;OUT DX,AX
JZ EMOUTDX_AX
CMP EAX,0E6H ;OUT XX,AL
JZ EMOUTXX_AL
CMP EAX,0E7H ;OUT XX,AX
JZ EMOUTXX_AX
CMP EAX,06CH ;INSB
JZ EMABOUTINSB
CMP EAX,06DH ;INSW
JZ EMABOUTINSW
CMP EAX,6EH ;OUTSB
JZ EMABOUTOUTSB
CMP EAX,6FH ;OUTSW
JZ EMABOUTOUTSW
CMP EAX,0F3H ;REP
JZ EMABOUTREP
JMP NOTRECOVER
EMINAL_DX:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
MOV AL,0 ;IN BYTE
CALL32F SEL_ICODE,CHECKINPORT
JC NOTEMULATION
MOV BYTE PTR [ESP+28H],AL ;EMULATION VALUE
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMINAX_DX:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
MOV AL,1 ;IN WORD
CALL32F SEL_ICODE,CHECKINPORT
JC NOTEMULATION
MOV WORD PTR [ESP+28H],AX ;EMULATION VALUE
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMINAL_XX:
MOV EDX,ES:[EBX] ;CURRENT INSTRUCTION
SHR EDX,8
AND EDX,0FFH ;PORT NO
MOV AX,SEL_UDATA
MOV GS,AX
MOV AL,0 ;IN BYTE
CALL32F SEL_ICODE,CHECKINPORT
JC NOTEMULATION
MOV BYTE PTR [ESP+28H],AL
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMINAX_XX:
MOV EDX,ES:[EBX] ;CURRENT INSTRUCTION
SHR EDX,8
AND EDX,0FFH ;PORT NO
MOV AX,SEL_UDATA
MOV GS,AX
MOV AL,1 ;IN WORD
CALL32F SEL_ICODE,CHECKINPORT
JC NOTEMULATION
MOV WORD PTR [ESP+28H],AX ;EMULATION VALUE
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMOUTDX_AL:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
MOV AL,BYTE PTR [ESP+28H] ;OLD EAX
MOV BL,10H ;OUT BYTE
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMOUTDX_AX:
MOV AX,SEL_UDATA
MOV GS,AX
MOV EDX,[ESP+20H] ;OLD EDX
MOV AX,WORD PTR [ESP+28H] ;OLD EAX
MOV BL,11H ;OUT WORD
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMOUTXX_AL:
MOV EDX,ES:[EBX] ;CURRENT INSTRUCTION
SHR EDX,8
AND EDX,0FFH ;OLD EDX
MOV AX,SEL_UDATA
MOV GS,AX
MOV AL,BYTE PTR [ESP+28H] ;OLD EAX
MOV BL,10H ;OUT BYTE
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMOUTXX_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
MOV BL,11H ;OUT WORD
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+30H+4] ;to next instruction
ADD EAX,2
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMABOUTINSB:
MOV AX,SEL_UDATA
MOV GS,AX
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
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ EMNOTCHANGE1
MOV AL,0 ;INBYTE
CALL32F SEL_ICODE,CHECKINPORT
JC NOTEMULATION
MOV BYTE PTR ES:[EDI],AL ;EMULATE DATA
MOV EAX,[ESP+0CH]
DEC EAX
AND EAX,0FFFFH
MOV [ESP+0CH],EAX ;change EDI
JMP EMINSBOVER
EMNOTCHANGE1:
MOV AL,0 ;IN BYTE
CALL32F SEL_ICODE,CHECKINPORT
JC NOTEMULATION
MOV BYTE PTR ES:[EDI],AL
MOV EAX,[ESP+0CH]
INC EAX
AND EAX,0FFFFH
MOV [ESP+0CH],EAX ;change EDI
EMINSBOVER:
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMABOUTINSW:
MOV AX,SEL_UDATA
MOV GS,AX
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
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ EMNOTCHANGE2
MOV AL,1 ;IN WORD
CALL32F SEL_ICODE,CHECKINPORT
MOV WORD PTR ES:[EDI],AX
MOV EAX,[ESP+0CH]
SUB EAX,2
MOV [ESP+0CH],EAX ;CHANGE EDI
JMP EMINSWOVER
EMNOTCHANGE2:
MOV AL,1 ;IN WORD
CALL32F SEL_ICODE,CHECKINPORT
MOV WORD PTR ES:[EDI],AX
MOV EAX,[ESP+0CH]
ADD EAX,2
MOV [ESP+0CH],EAX ;CHANGE EDI
EMINSWOVER:
MOV EAX,[ESP+30H+4] ;to next instruction
INC EAX
MOV [ESP+30H+4],EAX
JMP EMIOINSTRUCTIONOVER
EMABOUTOUTSB:
MOV AX,SEL_UDATA
MOV GS,AX
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
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ EMNOTCHANGE3
MOV AL,BYTE PTR ES:[ESI]
MOV BL,10 ;OUT BYTE
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+10H]
DEC EAX
AND EAX,0FFFFH
MOV [ESP+10H],EAX ;CHANGE ESI
JMP EMOUTSBOVER
EMNOTCHANGE3:
MOV AL,BYTE PTR ES:[ESI]
MOV BL,10 ;OUT BYTE
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+10H]
INC EAX
AND EAX,0FFFFH
MOV [ESP+10H],EAX ;CHANGE EDI
EMOUTSBOVER:
MOV EAX,[ESP+30H+4] ;OLD EIP
INC EAX
MOV [ESP+30H+4],EAX ;next instruction
JMP EMIOINSTRUCTIONOVER
EMABOUTOUTSW:
MOV AX,SEL_UDATA
MOV GS,AX
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
MOV EAX,[ESP+38H+4] ;OLD FLAG,DF
AND EAX,400H
JZ EMNOTCHANGE4
MOV AX,WORD PTR ES:[ESI]
MOV BL,11H ;OUT WORD
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+10H]
SUB EAX,2
AND EAX,0FFFFH
MOV [ESP+10H],EAX ;CHANGE ESI
JMP EMOUTSWOVER
EMNOTCHANGE4:
MOV AX,WORD PTR ES:[ESI]
MOV BL,11H
CALL32F SEL_ICODE,CHECKOUTPORT
JC NOTEMULATION
MOV EAX,[ESP+10H]
ADD EAX,2
AND EAX,0FFFFH
MOV [ESP+10H],EAX ;CHANGE ESI
EMOUTSWOVER:
MOV EAX,[ESP+30H+4] ;OLD EIP
INC EAX
MOV [ESP+30H+4],EAX ;next instruction
JMP EMIOINSTRUCTIONOVER
EMABOUTREP:
MOV EAX,GS:[EBX]
SHR EAX,8
AND EAX,0FFH
CMP EAX,6CH
JZ EMABOUTREPINSB
CMP EAX,6DH
JZ EMABOUTREPINSW
CMP EAX,6EH
JZ EMABOUTREPOUTSB
CMP EAX,6FH
JZ EMABOUTREPOUTSW
JMP NOTRECOVER
EMABOUTREPINSB:
EMABOUTREPINSW:
EMABOUTREPOUTSB:
EMABOUTREPOUTSW:
JMP EMIOINSTRUCTIONOVER
EMIOINSTRUCTIONOVER:
POP GS
POP FS
POP ES
POPAD
ADD ESP,8
IRETD
NOTGP:
MOV EAX,[ESP+30H]
ADD EAX,2
MOV [ESP+30H],EAX
POP GS
POP FS
POP ES
POPAD
ADD ESP,4
IRETD
NOTEMULATION:
MOV EAX,GS:CURBLOCKADDR
CALL32F SEL_CODE32,HEXOUT4
MOV EAX,GS:BYTESCOUNTER
CALL32F SEL_CODE32,HEXOUT4
NOTRECOVER:
MOV EAX,[ESP+30H+4]
MOV EBX,[ESP+34H+4]
SHL EBX,4
ADD EBX,EAX
MOV EAX,ES:[EBX]
CALL32F SEL_CODE32,HEXOUT4
POP GS
POP FS
POP ES
POPAD
PUSHAD
PUSH GS
PUSH FS
PUSH DS
PUSH ES
MOV AX,SEL_VIDEO
MOV ES,AX
MOV AX,CS
MOV DS,AX
;do dump
MOV ECX,4
INTL1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -