ARM汇编中是否有小型寄存器?

toz*_*han 0 assembly arm cpu-registers

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

arm
eor r0, r0
mov r0, #128

x86
xor eax, eax
mov al, 0x80
Run Code Online (Sandbox Code Playgroud)

r0现在包含0x80,但它是一个32位寄存器,因此它将包含0x00000080

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

tl; dr ARM汇编中是否有小的寄存器?

Not*_*hat 5

不会。ARM寄存器是32位1

但是,假设您使用的是最新的体系结构版本(ARMv6T2或更高版本),则可以使用BFIUBFX指令从另一个寄存器的底部插入/从另一个寄存器的底部提取任意切片,而不会影响其他位。做同样与立即数是有点麻烦,因为MOV零扩展立即数2(即eor r0,r0在你的例子是完全多余的) -你要么必须使用ANDORR如前所述,或使用中间寄存器MOV之后BFI


[1]好吧,一旦考虑AArch64状态,“固定大小”更合适-那里有相同寄存器的32位和64位视图,但是对32位视图的任何写入都隐含地将高32位置零。 ,因此同样的原理仍然适用(即不允许您假装拥有8086的一半大小的寄存器)。

[2]的例外是MOVT,它将立即数加载到寄存器的高16位而不触及低半部分(以允许使用MOVW/ MOVT对加载完整的32位立即数)