ARM ADD具有2个或3个操作数之间的差异?

问题描述 投票:0回答:1

查阅armkeil http://www.keil.com/support/man/docs/armasm/armasm_dom1361289861747.htm的文档,当您执行ADD函数时,总是需要3个变量,例如:

"MOV r2,#4 \n\t"
"ADD r2,r2,#3 \n\t"

这在寄存器2中的结果为7。但是当我尝试以下操作时:

"MOV r2,#4 \n\t"
"ADD r2,#3 \n\t"

结果是相同的,那两个之间的根本区别是什么?可以使用第二个吗?

assembly syntax arm add cpu-registers
1个回答
1
投票

[ARM语法允许在与目标相同的地方省略中间操作数(第一个源)。(至少在GAS“ Unified”语法中;最初,ARM Thumb语法仅在机器编码实际上具有单独的编码时才允许它GAS具有不同的语法; GCC通常将其置于.syntax unified模式IIRC,因此这是内联asm的上下文)

对于接受两者的汇编器,

ADD r2,r2,#3ADD r2,#3完全相同。 Keil的汇编程序可能不会,IDK。

Keil vs. GAS / GCC使用不同的指令,但我认为指令的语法大致相同。


[一些拇指指令编码仅具有编码2个操作数的空间,因此它们在机器代码级别上像dst += immediate,而不是dst = src + immediate。在汇编源代码级别,Keil将其记录为ADDS Rd, Rd, #imm(在您链接的页面中)。

adds的其他16位编码仅具有3位立即数(0..7),但使用这些位允许对单独的目的地adds Rd, Rn, #imm进行编码。

((请注意,add而不是adds通常需要32位指令,因此除非需要保留标志,否则不要这样做。)

我之所以这么说是因为您之前的问题是关于Cortex-M的。在ARM模式下组装时,GAS可能仍接受add r2, #3。第一个来源只是隐式的目的地。

© www.soinside.com 2019 - 2024. All rights reserved.