gpt4 book ai didi

assembly - 在 x86-64 索引寻址模式中使用 8 位寄存器

转载 作者:行者123 更新时间:2023-12-04 19:00:13 25 4
gpt4 key购买 nike

是否可以在 x86-64 的索引寻址模式中使用 8 位寄存器( al, ah, bl, bh, r8b )?例如:

mov ecx, [rsi + bl]
mov edx, [rdx + dh * 2]

特别是,这将允许您使用寄存器的底部 8 位作为 0-255 偏移量,这对某些内核可能有用。

我翻遍了 Intel 手册,但它们并没有明确说明这个问题,但是它们给出的所有示例都只有 32 位或 64 位基址和索引寄存器。在 32 位代码中,我只看到 16 位或 32 位寄存器。查看 mod-r/m 和 SIB 字节编码的细节似乎也指向“否”,但这已经足够复杂,有足够多的极端情况,我不确定我是否正确。

我最感兴趣的是 x86-64 的行为,但当然,如果只有在 32 位模式下才有可能,我想知道。

作为一个附加问题太小了,不值得再发表一篇文章 - 16 位寄存器可以用于基址或索引吗?例如, 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 在下面指出的那样,这导致了一些奇怪的情况,其中至少有一些指令(包括 pushpop)不能被编码为使用 32 位操作数,但可以使用 16 -bit 操作数(带有 0x66 前缀)。

关于assembly - 在 x86-64 索引寻址模式中使用 8 位寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39173410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com