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