gpt4 book ai didi

assembly - ARM汇编中有小寄存器吗?

转载 作者:行者123 更新时间:2023-12-05 08:43:49 29 4
gpt4 key购买 nike

我最近开始使用 ARM 汇编,并注意到我似乎只打算将 32 位值移动到寄存器中,但是如果我只想像在 x86 汇编中那样将 8 位或 16 位移动到寄存器中怎么办。即

arm
eor r0, r0
mov r0, #128

x86
xor eax, eax
mov al, 0x80

r0 现在包含 0x80 但它是一个 32 位寄存器所以它将包含 0x00000080

如果这是 x86,我可以使用 al(8 位寄存器)而不是 eax(32 位寄存器)来操作最后一个字节。

tl;dr ARM 汇编中有小寄存器吗?

最佳答案

没有。 ARM 寄存器是 32 位1

但是,假设您使用的是足够新的架构版本(ARMv6T2 或更高版本),您可以使用 BFIUBFX 指令插入/提取任意片段一个寄存器从/到另一个寄存器的底部而不影响其他位。对立即操作数执行相同的操作有点棘手,因为 MOV 零扩展立即数2(即您示例中的 eor r0,r0 是完全多余) - 你要么必须使用提到的 ANDORR,要么使用 MOV 的中间寄存器,然后是 BFI.


[1] 好吧,一旦你考虑到 AArch64 状态,“固定大小”就更合适了——你有相同寄存器的 32 位和 64 位 View ,但是任何对 32 位 View 的写入都会隐式地将高 32 位,所以同样的原则仍然适用(即它不允许你假装你有两倍于 8086 的半长寄存器)。

[2] MOVT 是个异常(exception),它将立即数加载到寄存器的高 16 位而不触及下半部分(以允许加载完整的 32 位立即数 MOVW/MOVT对)

关于assembly - ARM汇编中有小寄存器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23716689/

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