In 关于 GDT 的文章OSDev wiki 描述了用作 CS 描述符的 D 位的标志,如下所示:
Sz:尺寸位。如果0选择器定义16位保护模式。如果1它定义了32位保护模式。您可以同时拥有 16 位和 32 位选择器。
另一个问题引用了英特尔手册:代码段描述符中的 D 标志对于 x86-64 指令有何作用?链接到“3.4.5 段描述符”部分Intel 64 和 IA-32 架构软件开发人员手册第 3 卷 [...]:系统编程指南, 阅读:
D/B(默认操作大小/默认堆栈指针大小和/或上限)标志
根据段描述符是可执行代码段、向下扩展数据段还是堆栈段来执行不同的功能。 (对于 32 位代码和数据段,该标志应始终设置为 1;对于 16 位代码和数据段,该标志应始终设置为 0。)
• 可执行代码段。该标志称为 D 标志,它指示段中指令引用的有效地址和操作数的默认长度。如果设置了该标志,则假定为 32 位地址和 32 位或 8 位操作数;如果清楚,则假定为 16 位地址和 16 位或 8 位操作数。指令前缀66H可用于选择默认值以外的操作数大小,并且前缀67H可用于选择默认值以外的地址大小。
问题是,“D”代表什么?
我找到了一份副本Intel 80386 程序员参考手册,1987 年其中有以下描述16.1 80386 如何实现 16 位和 32 位功能:
允许 80386 在 32 位和 16 位地址和操作数大小下同样良好工作的架构特性包括:
-
代码段描述符的 D 位(默认位),它确定代码段指令的操作数大小和地址大小的默认选择。 (在不使用描述符的实地址模式和V86模式下,默认为16位。)设置了D位的代码段称为USE32段; D 位为零的代码段是 USE16 段。当所有指令都使用相同大小的操作数和有效地址时,D 位消除了对指令中的操作数大小和地址大小进行编码的需要。
-
显式覆盖操作数大小和地址大小的默认选择的指令前缀(在保护模式以及实地址模式和 V86 模式下可用)。
-
独立的 32 位和 16 位门用于段间控制传输(包括调用门、中断门和陷阱门)。控制传输的操作数大小由门的类型决定,而不是由传输指令的 D 位或前缀决定。
-
可用于 32 位和 16 位操作数以及有效地址计算的寄存器。
-
数据段描述符的 B 位(大位),它确定 CPU 用于隐式堆栈引用的堆栈指针(32 位 ESP 或 16 位 SP)的大小。
所以“D位”代表“Default操作数和地址大小”(对于代码段)和“B 位”对于“Big“(对于堆栈段)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)