Windows 代码段描述符中的D标志对x86-64指令有什么作用?

Windows 代码段描述符中的D标志对x86-64指令有什么作用?,windows,assembly,x86-64,intel,memory-segmentation,Windows,Assembly,X86 64,Intel,Memory Segmentation,我试图理解在x86-64代码中使用的代码段描述符中的D标志的工作原理。它设置在代码段描述符的D/B位22中,如图所示: “英特尔文档”部分说明了以下内容: D/B默认操作大小/默认堆栈指针大小和/或上限 束缚旗 执行不同的功能,具体取决于段是否 描述符是一个可执行代码段,一个向下扩展的数据段, 或堆栈段。对于32位,此标志应始终设置为1 代码和数据段,16位代码和数据段为0 •可执行代码段。该标志称为D标志,并且 指示有效地址和操作数的默认长度 由段中的说明引用。如果设置了标志,则为32位 假定

我试图理解在x86-64代码中使用的代码段描述符中的D标志的工作原理。它设置在代码段描述符的D/B位22中,如图所示:

“英特尔文档”部分说明了以下内容:

D/B默认操作大小/默认堆栈指针大小和/或上限 束缚旗

执行不同的功能,具体取决于段是否 描述符是一个可执行代码段,一个向下扩展的数据段, 或堆栈段。对于32位,此标志应始终设置为1 代码和数据段,16位代码和数据段为0

•可执行代码段。该标志称为D标志,并且 指示有效地址和操作数的默认长度 由段中的说明引用。如果设置了标志,则为32位 假定地址和32位或8位操作数;如果清楚的话, 假定为16位地址和16位或8位操作数。这个 指令前缀66H可用于选择其他大小的操作数 比默认值大,且前缀67H可用于选择地址 大小不是默认值

因此,我试图了解它会影响哪些x86-64指令以及如何影响这些指令

另外,当我试图在Windows内核中通过设置该位来运行一些测试时,操作系统立即出现三重故障。

如果为代码段描述符设置了L long模式,则D必须清除。L=1/D=1组合目前无意义/保留。Intel在您正在查看的同一文档中记录了这一点

如果L清除,则D在16位和32位模式之间选择。i、 e.默认操作数/地址大小。是的,16位保护模式存在,但是没有,没有人使用它

默认地址/操作数大小只有3种可能:

16位实模式,vm86,受保护:默认地址和操作数大小=16位 32位保护模式:默认地址和操作数大小=32位 64位模式:默认地址大小=64位,默认操作数大小=32位 没有选项使用16x64位寄存器,但默认操作数大小为16位或64位。或者默认地址大小为32位,可重写为64位。

如果为代码段描述符设置了L long模式,则D必须清除。L=1/D=1组合目前无意义/保留。Intel在您正在查看的同一文档中记录了这一点

如果L清除,则D在16位和32位模式之间选择。i、 e.默认操作数/地址大小。是的,16位保护模式存在,但是没有,没有人使用它

默认地址/操作数大小只有3种可能:

16位实模式,vm86,受保护:默认地址和操作数大小=16位 32位保护模式:默认地址和操作数大小=32位 64位模式:默认地址大小=64位,默认操作数大小=32位
没有选项使用16x64位寄存器,但默认操作数大小为16位或64位。或者默认地址大小为32位,可重写为64位。

哦,所以我设置L位和同时设置D位的做法是非法的,这就是为什么我会出现三重错误,对吗?请稍候。在再次阅读英特尔文档(我在上面展示过的文档)之后,为什么他们在同一段中提到66H和67H前缀,其中讨论了可执行代码的D标志?当在代码段描述符中设置L标志时,这些前缀仅在64位长模式下工作。因此,如果在这种情况下必须清除D标志,为什么它们会显示这些前缀?这正是让我困惑的地方。@MikeF:不,是REX前缀只是长模式。在32位模式下,操作数大小前缀在16位和32位之间交换,与在64位模式下交换相同,或与在16位模式下交换相反。e、 g.添加eax,eax在16位模式下需要66H前缀,但在32或64位模式下不需要。查看16位与32位模式下的addeax、[esi]与addax、[si]的一些汇编器输出。e、 g.运行nasm-l生成一个包含机器代码的列表哦,所以我设置l位和同时设置D位的做法是非法的,这就是为什么我会出现三重错误,对吗?请稍候。在再次阅读英特尔文档(我在上面展示过的文档)之后,为什么他们在同一段中提到66H和67H前缀,其中讨论了可执行代码的D标志?当在代码段描述符中设置L标志时,这些前缀仅在64位长模式下工作。因此,如果在这种情况下必须清除D标志,为什么它们会显示这些前缀?这正是让我困惑的地方。@MikeF:不,是REX前缀只是长模式。在32位模式下,操作数大小前缀在16位和32位之间交换,与在64位模式下交换相同,或与在16位模式下交换相反。e、 g.添加eax,eax在16位模式下需要66H前缀,但在32或64位模式下不需要。查看adde的一些汇编程序输出 ax、[esi]与添加ax、[si]在16位与32位模式下。e、 g.运行nasm-l生成包含机器代码的列表