我最近开始玩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汇编中是否有小寄存器?
答案 0 :(得分:5)
没有。 ARM寄存器是32位 1 。
但是,假设您使用的是最新的架构版本(ARMv6T2或更高版本),则可以使用BFI
和UBFX
指令从/向中插入/提取任意一个寄存器片段。另一个底部不影响其他位。使用立即操作数执行相同操作有点棘手,因为MOV
零延伸立即 2 (即示例中的eor r0,r0
完全是多余的) - 您要么拥有如上所述使用AND
和ORR
,或使用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位的操作。