- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在x86汇编中,为什么我们可以在16位“实模式”下使用eRx
,而不能在32位模式下使用rRx
?例如:
BITS 16
mov bx, 1
mov eax, 2
将正确组装和拆卸。它工作正常,因为我之前反汇编了 Win2k 引导加载程序并找到了对 eax
的引用。
可是,怎么就没有办法,即使在64位处理器上,在32位“保护模式”下,也不能访问rRx
?
最佳答案
这样做的原因是 64 位模式更改在一个特定位置的指令解码 - 即启用用于指示操作数大小的前缀字节 64 位/扩展寄存器宽度为 64 位/扩展寄存器对"new"的用法R8
.. R15
寄存器。这些不同于“备用大小前缀”(0x66
),后者对 x86 通用(独立于 CPU 操作模式),如果在 16 位模式下,则将操作数/寄存器大小从 16 位更改为 32 位,反之亦然,从 32 位到如果在 32 位模式下,则为 16 位。
所谓REX
前缀编码为 0x40
.. 0x4f
如果 CPU 在 64 位模式下运行,则仅作为前缀有效。为什么 ?好吧 - 如前所述,更改了指令解码,这些操作码实际上映射到 inc <reg>
的单字节版本/dec <reg>
在经典 x86 中。
这是可能的,因为 16/32 位指令集中的歧义 - inc EAX
可以是任一个 0x40
或 0xff 0xc0
.在 64 位模式下,指令解码器只接受 0xff 0xc0
为了这。另一方面,0x40
,如图所示,成为 REX
之一前缀。
因此 - 这些 64 位操作数大小前缀在 16 位/32 位模式下不存在(它们是 inc
/dec
操作然后...),因此 16 位/32 位 x86 代码声明“我想做一个 64 位操作”。
例如,这里是一些具有不同操作数大小的指令的汇编/操作码:
64bit 32bit option 1 32bit option 2 instruction============================================================= fe c8 fe c8 -- dec al 66 ff c8 66 ff c8 66 48 dec ax ff c8 ff c8 48 dec eax 48 ff c8 -- -- dec rax
如您所见,64 位系统不知道 dec eax
的单字节版本, 但它知道 0x48
作为(几个)指令前缀说“使它成为 64 位操作”。
关于assembly - 为什么我们可以在16位模式下使用eRx,而在32位模式下不能使用rRx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030668/
我刚刚从 Dynamics 创建了一个表格图表,但我无法打开该文件,我尝试使用 Erwin Data Modeler 但无法打开 ERX 文件。有什么想法吗? 最佳答案 如果您尝试使用 Erwin 和
我是一名优秀的程序员,十分优秀!