在GDT上的文章中,OSDev wiki描述了用作CS描述符的D位的标志,如下所示:
Sz:大小位。如果0,选择器定义16位保护模式。如果1,则定义32位保护模式。您可以同时拥有16位和32位选择器。
另一个问题引用了英特尔手册:代码段描述符中的D标志对x86-64指令有什么作用?其链接到部件";3.4.5段描述符";摘自《英特尔64与IA-32体系结构软件开发人员手册》第3卷[…]:系统编程指南,阅读:
D/B(默认操作大小/默认堆栈指针大小和/或上限(标志
根据段描述符是可执行代码段、向下展开的数据段还是堆栈段,执行不同的函数。(对于32位代码和数据段,此标志应始终设置为1,对于16位代码和数字段,此标记应设置为0。(
•可执行代码段。该标志被称为D标志,它指示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定32位地址和32位或8位操作数;如果是清楚的,则假定16位地址和16位或8位操作数。指令前缀66H可用于选择除默认值之外的操作数大小,并且前缀67H可用于选定除默认值以外的地址大小。
问题是;D";代表
我找到了一份1987年的《英特尔80386程序员参考手册》,该手册在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位";代表">默认操作数和地址大小"(对于代码段(和";B位";对于">大";(对于堆栈段(。