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汇编中是否有小的寄存器?
不会。ARM寄存器是32位1。
但是,假设您使用的是最新的体系结构版本(ARMv6T2或更高版本),则可以使用BFI和UBFX指令从另一个寄存器的底部插入/从另一个寄存器的底部提取任意切片,而不会影响其他位。做同样与立即数是有点麻烦,因为MOV零扩展立即数2(即eor r0,r0在你的例子是完全多余的) -你要么必须使用AND和ORR如前所述,或使用中间寄存器MOV之后BFI。
[1]好吧,一旦考虑AArch64状态,“固定大小”更合适-那里有相同寄存器的32位和64位视图,但是对32位视图的任何写入都隐含地将高32位置零。 ,因此同样的原理仍然适用(即不允许您假装拥有8086的一半大小的寄存器)。
[2]的例外是MOVT,它将立即数加载到寄存器的高16位而不触及低半部分(以允许使用MOVW/ MOVT对加载完整的32位立即数)