📄 switch.asm
字号:
INCLUDE REGS386.INC
INCLUDE TRANS.INC
.386p
DGROUP group _DATA
_DATA segment word public 'DATA' use16
extrn _cs16real: word
extrn _ds16real: word
trs TRANS <> ; translation struct for r-mode switch
goProtectMode dd ? ; Location of far call routine
_DATA ends
_TEXT segment byte public 'CODE' use16
assume cs:_TEXT,ds:DGROUP
;
; void RealModeSwitch(void)
;
public _RealModeSwitch
_RealModeSwitch proc near
pop bx ;Where to return from this procedure
movzx ebx, bx
movzx esi, si
movzx edi, di
movzx ebp, bp
mov dword ptr trs.T_EBX, ebx
mov dword ptr trs.T_ESI, esi
mov dword ptr trs.T_EDI, edi
mov dword ptr trs.T_EBP, ebp
mov word ptr trs.T_SP, sp
sub word ptr trs.T_SP, 512
mov word ptr trs.T_IP, offset _TEXT:@@realModeEntry
mov word ptr trs.T_FLAGS, 0202h
mov ax, _cs16real
mov word ptr trs.T_CS, ax
mov ax, _ds16real
mov word ptr trs.T_DS, ax
mov word ptr trs.T_ES, ax
mov word ptr trs.T_SS, ax
xor ebx, ebx
xor ecx, ecx
push ds
pop es
mov di, offset DGROUP:trs
movzx edi, di
mov ax,0301h
int 31h
mov esi, dword ptr trs.T_ESI
mov edi, dword ptr trs.T_EDI
mov ebp, dword ptr trs.T_EBP
mov sp, word ptr trs.T_SP
jmp word ptr trs.T_EBX ; stored by DPMIprotectedMode() below
@@realModeEntry:
pop goProtectMode ; Address to return from real mode callback
push bx ; Address stored in realRegs above
ret ; RealModeSwitch()
_RealModeSwitch endp
;
; void ProtectedModeSwitch(void)
;
public _ProtectedModeSwitch
_ProtectedModeSwitch proc near
pop bx ;Return point (will be used in
mov dword ptr trs.T_EBX, ebx ; RealModeSwitch above)
mov dword ptr trs.T_ESI, esi
mov dword ptr trs.T_EDI, edi
mov dword ptr trs.T_EBP, ebp
mov word ptr trs.T_SP, sp
jmp goProtectMode ;Saved retf address from real mode callback
_ProtectedModeSwitch endp
_TEXT ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -