最近在学习保护模式,遇到一些问题,希望懂的人不吝赐教
由实模式跳入保护模式及跳出的步骤以下有没有问题?
0.关中断
1.打开20位地址线 /*疑问一:是否无论在保护模式还是实模式只要打开20位地址线就可以寻址超1M内存? 同时,实模式下是否也可使用EAX等?*/
2.修改CR0第0位 /*疑问二:在CR0第0位修改后,是否立即开始采用选择子的方式进行寻址?跳转中采用远跳转的方式而不是继续执行下一条指令
*的原因是不是要 清空指令队列?(《80X86汇编语言程序设计教程》by杨季文等一书P378页中进入保护模式JUMP中的目的地址就
*是下一条指令)如果是,那么指令队列是什么,IP寄存器指向下一条要执行的指令的地址,还有隐藏的寄存器存储了那条指令
*(即IP所指的那条指令)吗?*/
3.跳转到32位代码段
4.开中断
。。。。
5.加载空描述符至段寄存器
6.关中断
7.修改CR0第0位
8.跳转 ;此处的跳转指令为宏指令 JUMP <SEG REAL>,<OFFSET REAL> 如果标号REAL处的地址在1M以外,那么段地址怎么取值?
;即使跳回去了,那还是在访问了FFFF:FFFF以外的地址呀?在关闭20位地址线后会怎样?
9.开中断
10.关20位地址总线
11.重置段寄存器
32位段与16位段的区别到底是什么?是否只在于寻址时偏移使用32位还是16位的区别(即偏移最大是4G还是64K)。那16位段的寻址方式是8086的段地址加偏移,还是利用选择子的段地址加偏移?如果是8086式寻址,那么16位段不就限制在内存最低1M内了吗?
同时,在32位代码段切换到16位代码段代码如下:
JUMP32 CODEL16-SEL,<OFFSET SPM16> ;此为MSAM宏指令,定义如下:
JUMP32 MACRO selector,offsetv
DB 0EAH
DW offsetv
DW 0
DW selector
ENDM
《80X86汇编语言程序设计教程》书中说“该转移指令含48位全指针,其高16位是16位代码段的选择子,低32位是16位代码段的入口偏移。该指令在32位方式下预取,在16位方式下执行”这里32位下预取是什么意思?
ORG伪指令后接的地址是程序转载地址,该地址是指虚拟地址还是物理地址?
NASM汇编的代码,最初运行时,CS,SS等段寄存器的值都默认是0吗?