我学习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的两个操作数的含义? 非常感谢!
鉴于该评论的信息,这确实是ARM代码,而不是16位Thumb,那么答案是,你的参考材料早UAL。
引入沿带来的Thumb-2指令集的修改汇编语法称为统一汇编语言所取代,其先前的语法为ARM和Thumb。 而不是具有两个单独的(和不兼容的)的语言,UAL允许(合理的)相同的源组装到ARM或Thumb指令。 一个这样的后果是,对于具有2个操作数的拇指上等同的任何3个操作数的ARM指令,指定目的地寄存器是可选的 - 如果省略其将默认为第一源寄存器*。
大多数编译器仍然会支持兼容旧的预UAL语法,但是因为有一些可能引起混淆的变化这是值得升级到更现代的参考一旦你过去的基础知识(如近浮点助记符全部)。
*除的情况下MUL
它是另一种方式的一轮尴尬的技术原因。
这是一个快捷符号,没有2操作数在ARM添加或子(不过拇指确实有他们)。
add r0, r1
基本上是指使用所述第一操作数作为目的地和第一源寄存器。 它等同于下面的指令和被组装在相同的指令。
add r0, r0, r1