在学80386保护模式,有一堆问题要问大神,百度很难找答案的。
最近在学习保护模式,遇到一些问题,希望懂的人不吝赐教由实模式跳入保护模式及跳出的步骤以下有没有问题?
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吗?