ARM组件中是否有小寄存器?

时间:2014-05-17 22:27:34

标签: assembly arm cpu-registers

我最近开始玩ARM程序集并注意到我似乎只是要将32位值移动到寄存器中但是如果我只想将8位或16位移入寄存器中,就像在x86汇编中一样。 即。

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汇编中是否有小寄存器?

2 个答案:

答案 0 :(得分:5)

没有。 ARM寄存器是32位 1

但是,假设您使用的是最新的架构版本(ARMv6T2或更高版本),则可以使用BFIUBFX指令从/向中插入/提取任意一个寄存器片段。另一个底部不影响其他位。使用立即操作数执行相同操作有点棘手,因为MOV零延伸立即 2 (即示例中的eor r0,r0完全是多余的) - 您要么拥有如上所述使用ANDORR,或使用MOV的中间注册,后跟BFI


[1]嗯,一旦考虑AArch64状态,“fixed-size”更合适 - 你有相同寄存器的32位和64位视图,但是对32位视图的任何写入都隐含地为零高32位,所以同样的原则仍然适用(即它不允许你假装你有两倍大小的寄存器,如8086)。

[2]这个例外是MOVT,它将一个立即加载到寄存器的高16位而不触及下半部分(允许用{{1}加载一个完整的32位立即数。 } / MOVW对)

答案 1 :(得分:2)

arm
eor r0, r0
mov r0, #128

为什么不这样做呢:

mov r0,#128

没有理由......

不,你的臂没有相同的8位历史记录,所以寄存器从一开始就以32位开始。但是你仍然有许多指令可以帮助你对寄存器进行低于32位的操作。