我最近开始学习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位寄存器)。
简而言之,ARM汇编中是否有小型寄存器?
mov eax, 0x80
可以节省1个字节的代码大小,但这并不值得。编译器会使用mov eax, 0x80
,因为运行一个单一uop指令比运行两个更有效率,即使它多花费了一个字节的代码大小。一个更好的例子是像shl al, 4
这样实现(uint8_t) (x<<4)
,而不是将位移位超过EAX的高位。 - Peter Cordes