Assembly 臂组件中是否有小的寄存器?

Assembly 臂组件中是否有小的寄存器?,assembly,arm,cpu-registers,Assembly,Arm,Cpu Registers,我最近开始使用ARM汇编,注意到我似乎只打算将32位值移动到寄存器中,但如果我只想将8位或16位移动到寄存器中,比如x86汇编中,该怎么办。 i、 e r0现在包含0x80,但它是一个32位寄存器,因此它将包含0x00000080 如果这是x86,我可以使用al(8位寄存器)来操作最后一个字节,而不是eax(32位寄存器) tl;dr ARM组件中是否有小寄存器?否。ARM寄存器为32位1 但是,假设您使用的是足够新的体系结构版本(ARMv6T2或更高版本),则可以使用BFI和UBFX指令从另一

我最近开始使用ARM汇编,注意到我似乎只打算将32位值移动到寄存器中,但如果我只想将8位或16位移动到寄存器中,比如x86汇编中,该怎么办。 i、 e

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

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


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

否。ARM寄存器为32位1

但是,假设您使用的是足够新的体系结构版本(ARMv6T2或更高版本),则可以使用
BFI
UBFX
指令从另一个寄存器的底部插入/提取寄存器的任意片,而不会影响其他位。对立即数操作数执行同样的操作有点棘手,因为
MOV
zero扩展了立即数2(即在您的示例中
eor r0,r0
是完全冗余的)-您必须使用
ORR
,或者为
MOV
使用中间寄存器,后跟
BFI


(1)当你考虑AGARC64状态时,“固定大小”更合适——你有相同的寄存器的32位和64位的视图,但是任何对32位视图的写入都隐式地将上32位零,因此同样的原理仍然适用(也就是说,它不允许你假装有两倍于一半大小的寄存器,比如8086)。


[2] 例外情况是
MOVT
,它将一个立即数加载到寄存器的上16位,而不接触下半位(允许使用
MOVW
/
MOVT
对加载完整的32位立即数)

否。ARM寄存器是32位1

但是,假设您使用的是足够新的体系结构版本(ARMv6T2或更高版本),则可以使用
BFI
UBFX
指令从另一个寄存器的底部插入/提取寄存器的任意片,而不会影响其他位。对立即数操作数执行同样的操作有点棘手,因为
MOV
zero扩展了立即数2(即在您的示例中
eor r0,r0
是完全冗余的)-您必须使用
ORR
,或者为
MOV
使用中间寄存器,后跟
BFI


(1)当你考虑AGARC64状态时,“固定大小”更合适——你有相同的寄存器的32位和64位的视图,但是任何对32位视图的写入都隐式地将上32位零,因此同样的原理仍然适用(也就是说,它不允许你假装有两倍于一半大小的寄存器,比如8086)。 [2] 例外情况是

MOVT
,它将一个立即数加载到寄存器的上16位,而不接触下半位(允许使用
MOVW
/
MOVT
对加载完整的32位立即数)

为什么不干脆这样做呢:

mov r0,#128
没有理由提高采收率

不,arm没有相同的8位历史记录,因此寄存器从一开始就是32位的。但仍然有许多指令可以帮助您在寄存器上执行低于32位的操作

为什么不干脆这样做呢:

mov r0,#128
没有理由提高采收率


不,arm没有相同的8位历史记录,因此寄存器从一开始就是32位的。但是您仍然有许多指令可以帮助您在寄存器上执行32位以下的操作。

您有关于ARM组装的文档吗?要仅更改较低的x位,需要使用AND清除它们,然后使用OR设置。RISC体系结构几乎总是在整个寄存器上工作。没有办法在寄存器的一小部分上进行操作:与5字节
mov-eax、0x80
相比,x86代码节省了1字节的代码大小,但这并不值得。编译器将使用
mov eax,0x80
,因为运行一条uop指令而不是两条指令更有效,即使它需要额外的代码大小字节。一个更好的例子是像
shl al,4
这样的东西来实现
(uint8\t)(XD)您有关于ARM汇编的文档吗?要仅更改较低的x位,您需要使用AND清除它们,然后使用OR设置。RISC体系结构几乎总是在整个寄存器上工作。无法对寄存器的一小部分进行操作相关:x86代码与5字节
mov eax,0x80
相比,节省了1字节的代码大小,但它不是不值得。编译器将使用
mov-eax,0x80
,因为运行一条uop指令而不是2条指令更有效,即使它需要额外的代码大小字节。更好的例子是像
shl al,4
这样的东西来实现
(uint8\t)(xI认为xor是没有意义的,因为整个32位都被修改了,但我保留了它,因为对称性很好…理解,您可以在x86中使用32位立即数,也可以使用另一个示例,因为您试图修改整个32/64位寄存器,而不是示例中的8位。我认为xor是没有意义的,因为修改了全部32位,但我保留了它,因为对称性很好…理解,您可以在x86中使用32位立即数,也可以使用另一个示例,因为您尝试修改整个32/64位寄存器,而不是示例中的8位寄存器。
mov r0,#128