相关疑难解决方法(0)

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

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

在此处输入图片说明

英特尔文档(来自第3.4.5段描述符)声明如下:

在此处输入图片说明

D/B(默认操作大小/默认堆栈指针大小和/或上限)标志

根据段描述符是可执行代码段、向下扩展数据段还是堆栈段执行不同的功能。(对于 32 位代码和数据段,此标志应始终设置为 1,对于 16 位代码和数据段,应始终设置为 0。)

• 可执行代码段。该标志称为 D 标志,它表示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定为 32 位地址和 32 位或 8 位操作数;如果清楚,则假定为 16 位地址和 16 位或 8 位操作数。指令前缀 66H 可用于选择默认值以外的操作数大小,前缀 67H 可用于选择默认值以外的地址大小。

所以我试图了解它影响哪些 x86-64 指令以及如何影响?

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

windows assembly x86-64 intel memory-segmentation

1
推荐指数
1
解决办法
672
查看次数

在 x86 32 位保护模式下,使用 PUSH/POP 指令时,我们还可以使用 SP 而不是 ESP 寄存器吗?

不知道什么时候用SP寄存器,什么时候用ESP寄存器,另外我想知道什么时候用ESP寄存器,是不是总是减4不能减2?

x86 assembly protected-mode

1
推荐指数
1
解决办法
69
查看次数