问题描述
- 在保护模式的无特权级变换的转移
- 在保护模式下采用 JMP 和 RETF 指令进行任务内无特权级变换的转移.最好是能给出程序和说明,而不是到处引用,新手勿扰。
解决方案
用 JUMP、CALL、RETF等指令进行相应段的转移。在用到 CALL 指令时,使用堆栈,以使得在调用 CALL时,系统对 CALL 当前的程序运行点进行压栈保存,在遇到 RETF 返回指令时,进行弹栈返回。
解决方案二:
(1)实模式下的初始化,包括对GDT和演示任务LDT的初始化,装载GDTR;
(2)从实模式切换到保护模式,处于0特权级;
(3)装载LDTR,并设置堆栈;
(4)利用段间转移指令JMP实现从代码段K到同级代码段L的转移;
(5)利用段间调用指令CALL调用同级代码段C中的子程序D显示字符串信息;
(6)利用段间调用指令CALL调用同级代码段C中的子程序H把十六进制数转换成对应的ASCII码;
(7)再利用段间调用指令CALL调用同级代码段C中的子程序D显示字符串信息;
(8)利用段间转移指令JMP实现从代码段L到代码段K的转移;
(9)从保护模式切换到实模式;
(10)在实模式下结束程序。
该实例的逻辑功能是用十六进制数的形式显示代码段L的段界限的值。源程序如下:
;名称:ASM3.ASM
;功能:演示任务内无特权级变换的转移
;编译:TASM ASM3.ASM
;连接:TLINK ASM3.OBJ
INCLUDE 386SCD.INC
GDTSeg SEGMENT PARA USE16 'GDT' ;全局描述符表数据段(16位)
GDT LABEL BYTE ;全局描述符表
DUMMY Desc <> ;空描述符
Normal Desc ;规范段描述符
CodeK Desc ;代码段K的描述符
LDTable Desc ;局部描述符表段的描述符
GDTLen = $-GDT ;全局描述符表长度
Normal_Sel = Normal-GDT ;规范段描述符选择子
CodeK_Sel = CodeK-GDT ;代码段K的选择子
LDT_Sel = LDTable-GDT ;局部描述符表段的选择子
GDTSeg ENDS ;全局描述符表段定义结束
LDTSeg SEGMENT PARA USE16 'LDT' ;局部描述符表数据段(16位)
LDT LABEL BYTE ;局部描述符表
;代码段L的描述符
CodeL Desc
;代码段C的描述符
CodeC Desc
;显示缓冲区段描述符
VideoBuf Desc
;LDT别名段描述符(DPL=3)
ToLDT Desc
;显示信息缓冲区数据段描述符(DPL=3)
MData Desc
;堆栈段描述符
StackS Desc
LDTLen
解决方案三:
保护模式编程——保护的详尽意义:通过调用门转移特权级
http://www.zdh1909.com/html/Verilog/29918.html
解决方案四:
希望对你有帮助:http://blog.sina.com.cn/s/blog_6b140d210100k2rw.html