实模式使用32位寄存器

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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)的内存里

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航