实模式使用32位寄存器

时间:2021-09-05 14:43:46

16位模式与32位模式:
在如下情况下使用16位模式:
实模式;
虚拟86模式;
系统管理模式;
保护模式但代码数据堆栈段都设为16位;
同时含有16位和32位段的保护模式任务;
含有16位指令的32位代码段。

在保护模式下如何将16位模式与32位模式整合,如何同时将16位和32位代码放到32位代

码段中?

ia32用如下方式来区分16位和32位段和操作:
1.代码段描述符的标志位D(缺省操作数和地址大小)。
代码段描述符的D标志置位(置1)则是32位,清除(置0)则是16位。实模式和虚拟86模式

下不使用段描述符,因此缺省就是16位。
2.堆栈段描述符的标志位B(缺省堆栈大小)。
堆栈段描述符B指明了栈顶指针的大小(32位esp或16位sp寄存器),
3.16位和32位调用门,中断门,陷阱门。
当通过调用门,中断门,陷阱门在代码段之间传递程序控制权时,所使用的操作数的大

小(位数)由调用门,中断门,陷阱门的位数决定,而不是由D标志位和传送指令前缀决

定。门的位数决定如何在栈中保存返回信息。
4.16位和32位普通用途寄存器。

对大多数程序来说,32位任务必须使D标志位和B标志位置位,而对于16位程序来说则必

须清除这两个标志。(实模式和v86模式下无上述标志,默认16位)。
控制权由16位段向32位段转移的时候需要通过门。

使用操作前缀(prefixes)可以改写缺省的操作数和地址的大小。(在D标志位和B标志位

清除的情况下使用32位寄存器)。标志位可在任意模式下使用。
操作前缀仅在有限时间内(即前缀所作用的语句)改变操作数和地址的大小。

以下操作前缀可以允许在同一个段中使用16和32位操作。
操作数前缀:66h
地址前缀:67h
使用上述操作前缀会将D标志位和B标志位置位置反。

例如:
将32位操作数从32位寄存器移到一个32位有效地址(EA)的内存里。
使用操作数前缀,可将16位操作数从16位寄存器移到一个32位有效地址(EA)的内存里。
使用地址前缀,可将32位操作数从32位寄存器移到一个16位有效地址(EA)的内存里。
如果同时使用操作数和地址前缀,可将16位操作数从16位寄存器移到一个16位有效地址

(EA)的内存里