- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在 x86-64 的索引寻址模式中使用 8 位寄存器( al, ah, bl, bh, r8b
)?例如:
mov ecx, [rsi + bl]
mov edx, [rdx + dh * 2]
mov rax, [rbx + cx]
.我的调查指向与上述基本相同的答案:可能不是。
最佳答案
不,您不能在 64 位模式下在寻址计算中使用 8 位或 16 位寄存器,也不能在 32 位模式下使用 8 位寄存器。您可以在 32 位模式下使用 16 位寄存器,在 64 位模式下使用 32 位寄存器,通过使用 0x67
地址大小前缀字节。
(但使用更窄的寄存器会使整个地址变窄,而不是相对于 32 位数组地址的 16 位索引。任何寄存器都需要与地址相同的宽度,您通常希望与您使用的模式匹配in,除非您在地址空间的低 16 位或低 32 位中有内容。)
This table很好地总结了操作数和地址大小的各种选项。一般模式是默认地址大小与当前模式相同(即32位模式下32位,64位模式下64位)1,然后如果0x67
包括前缀,地址大小更改为通常大小的一半(即,32 位模式下为 16 位,64 位模式下为 32 位)。
这是上面链接的完整表格的摘录,仅显示了 64 位长模式行为,适用于 REX.W
的各种值。 , 0x66
操作数和 0x67
地址大小前缀:
雷克斯.W
0x66 前缀(操作数)
0x67 前缀(地址)
操作数大小(脚注 2)
地址大小
0
不
不
32 位
64 位
0
不
是的
32 位
32 位
0
是的
不
16 位
64 位
0
是的
是的
16 位
32 位
1
忽略
不
64 位
64 位
1
忽略
是的
64 位
32 位
1 这似乎很明显,但它与操作数大小在 64 位模式下的工作方式相反:大多数默认为 32 位,即使在 64 位模式下,并且需要一个 REX 前缀将它们提升为 64 位。
2 Some instructions默认为 64 位操作数大小,没有任何 REX
前缀,特别是 push
, pop
, call
和条件跳转,正如 Peter 在下面指出的那样,这导致了一些奇怪的情况,其中至少有一些指令(包括 push
和 pop
)不能被编码为使用 32 位操作数,但可以使用 16 -bit 操作数(带有 0x66
前缀)。
关于assembly - 在 x86-64 索引寻址模式中使用 8 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39173410/
我是一名优秀的程序员,十分优秀!