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

标签 assembly arm cpu-registers

我最近开始使用 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/

相关文章:

c++ - GCC 生成的程序集

assembly - 指令流水线与每个指令的周期之间的链接

linux-kernel - 用于 ARM 的 Linux 中的矢量页面映射

64 位架构中的汇编寄存器

memory-address - 如何正确计算地址空间?

c - 抢占式调度算法

c - 相同的二进制文件,但不同调试器中的堆栈指针 (ESP) 地址不同

assembly - 赋值指令未将新值分配给 emu8086 中的符号

android - bogoMIPS 值正在改变

linker - 了解 ARM Cortex-M 微 Controller 的链接描述文件