📄 00000002.htm
字号:
┌——————┐ <BR>│TSS 表格简介│ <BR>└——————┘ <BR> TSS 也有人称为「工作切换」 ,其表格设定如下 ,详情可看书比较详细。 <BR> <BR>tssltr dd 00000000h <BR> dd 0000ff00h ;ESP <BR> dw 0028h,0000h ;SS.0 <BR> dd 0,0,0,0,0 <BR> dw offset enter_v86,0000h ;EIP <BR> dd 00000200h ;EFlag <BR> dd 0,0,0,0 <BR> dd 0000ff00h ;ESP <BR> dd 0,0,0 <BR> dw 0010h,0000h ;ES.0 <BR> dw 0008h,0000h ;CS.0 <BR> dw 0028h,0000h ;SS.0 <BR> dw 0010h,0000h ;DS,0 <BR> dw 0010h,0000h ;FS.0 <BR> dw 0010h,0000h ;GS.0 <BR> dw 0000h,0000h ;LDT.0 <BR> dw 0000h,0068h ;0.IOMAP起点 <BR> db 1000h dup (0) ;4K IOMAP 表 <BR> dw 0ffffh <BR> <BR> <BR> 如果您的程式使用 JMP XXXX:YYYYYYYY 的方式跳到本区节的话 ,原本指定的 <BR>YYYYYYYY 将无用途 ,因为所有的暂存器将被替换成此表格的数值(含CS.EIP) ,并 <BR>完成等级切换的动作。 <BR> <BR> <BR>-------------------------------------------------------------------------- <BR>┌———————┐ <BR>│进入 V86 模式│ <BR>└———————┘ <BR> <BR> cli <BR> lgdt fword ptr cs:gdtadds <BR> lidt fword ptr cs:idtadds <BR> mov eax,cr0 <BR> or al,01h <BR> mov cr0,eax <BR> mov bx,0018h <BR> ltr bx ;发生工作切换时 ,SS:ESP 将参考 0018 的区段表格 <BR> jmp 0020h:0000h ;进入工作切换 ,会跳到此表格内指定的 CS:EIP <BR> (LTR.JMP 不可指向同一表格) <BR> <BR>enter_v86 : ;假设您已将 CS:EIP 指向此处继续执行 <BR> xor eax,eax <BR> mov ax,code <BR> push eax ;GS <BR> push eax ;FS <BR> push eax ;DS <BR> push eax ;ES <BR> push eax ;SS <BR> mov ax,0f000h <BR> push eax ;ESP <BR> mov eax,00023000h ;设定VM=1 等级=3 <BR> push eax ;Eflag <BR> xor eax,eax <BR> mov ax,code <BR> push eax ;CS <BR> mov ax,offset return_dos <BR> push eax ;EIP <BR> clts ;将 387 切换成 32 位元模式 <BR> iretd ;回到 V86 (共弹出24h BYTE) <BR> <BR>紧接著就程式回到 V86 下继续执行著... <BR>-------------------------------------------------------------------------- <BR>┌————————┐ <BR>│中断向量表的处理│ <BR>└————————┘ <BR> <BR> 在保护模式下 ,产生中断後 ,会切回保护模式 ,於是您必需去呼叫原先 V86 下 <BR>的中断表 ,以便让程式能够正确执行。 <BR> <BR> V86 下发生中断後 ,CPU 会取出 LTR 所设定 SS:ESP 值 ,然後将 V86 下的众 <BR>多暂存器暂存於此 ,不过因为 CPU 已变成 32 位元模式 ,所以堆叠内的 SP 值会被 <BR>减 12 byte (原本是6byte ,用以摆放 IP.CS.FLAG) ,且堆叠内的EIP值会指向 V86 <BR>下的 INT_X 的下一行 ,因此你必需先将 V86 下的 SP 值加 6 byte ,并修改 V86 下 <BR>的 SS:SP 里的内容为 INT_X 的下一行 ,然後将保护模式下的堆叠 CS:EIP 值指向原 <BR>V86 下的中断位址 ,这样才可以带动 V86 下的中断表。 <BR> <BR> 底下仅列出部份中断的处理方式....您必需处理 256 个中断表。 <BR> <BR>new_20 : <BR> push 0020h <BR> jmp int_emu <BR>new_21 : <BR> push 0021h <BR> jmp int_emu <BR>new_22 : <BR> push 0022h <BR> jmp int_emu <BR>new_23 : <BR> push 0023h <BR> jmp int_emu <BR> <BR>int_emu : <BR> push bp <BR> mov bp,sp <BR> add bp,04h <BR> push eax <BR> push ebx <BR> mov ax,0010h ; <BR> mov ds,ax ;(Selector 0010h 的 Base=0) <BR> mov ax,ss:[bp+0ch] ; <BR> sub ax,06h ;改V86的SP-6 <BR> mov ss:[bp+0ch],ax ; <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -