在ARM中只有两个操作数的ADD或SUB

时间:2014-08-26 10:48:53

标签: assembly arm

我正在学习ARM汇编语言。 我读取ADD应该有3个操作数。但是,我发现很多情况实际上只有两个。如:

STR     R1, [SP,#0x20+var_1C]
LDR     R1, =(a_lua - 0x1DE4E6)
MOVS    R0, R4          ; haystack
ADD     R1, PC          
BLX     strstr
CMP     R0, #0
BNE     loc_1DE4FA

任何人都可以用两个操作数帮助我理解ADD的含义吗?非常感谢!

2 个答案:

答案 0 :(得分:4)

鉴于评论中的信息,这实际上是ARM代码,而不是16位Thumb,那么答案是您的参考资料早于UAL。

Thumb-2指令集的引入带来了modified assembly syntax称为统一汇编语言,它取代了以前的ARM和Thumb语法。 UAL不是拥有两种独立的(和不兼容的)语言,而是允许(在合理范围内)将相同的源组装到ARM或Thumb指令中。其中一个后果是,对于具有2操作数Thumb等效的任何3操作数ARM指令,指定目标寄存器是可选的 - 如果省略,它将默认为第一个源寄存器*。

大多数汇编程序仍然支持旧的UAL前UAL语法以实现兼容性,但是一旦超出基础知识就值得更新为更现代的引用,因为存在一些可能令人困惑的更改(例如几乎所有的浮点助记符)

*除MUL外,由于技术原因尴尬,反之亦然。

答案 1 :(得分:3)

这是一个快捷符号,ARM中没有2个操作数add或sub(但Thumb确实有它们)。

add r0, r1

基本上意味着使用第一个操作数作为目标和第一个源寄存器。它与下面的指令相同,并汇编到同一条指令。

add r0, r0, r1