1)简单的寄存器操作
典型的ARM数据处理指令的格式如下:
ADD R0,R1,R2 ;R0<-R1+R2
分好后面是注释语句,应该被汇编器忽略。加入注释语句使汇编代码更加易读和易解释。这个例子只是简单地取2个寄存器值的和,并将结果放在第2个寄存器。寄存器的值都是32位。
在编写汇编语言源代码时,必须注意操作数的正确顺序,第一个是结果寄存器,然后是第1操作数,最后是第2操作数(对于**操作,第1和第2操作数都是寄存器,它们的次序并不重要)。当这些指令执行时,对系统而言,惟一的变化是目的寄存器R0的值。当然,如果指定S,则CPSR中的标志位N、Z、C和V的值也会有选择的变化。
2)立即数操作
在数据处理指令中,第2操作数除了可以是寄存器,还可以是一个立即数。如果只有希望把一个常数加到寄存器,而不是2个寄存器相加,则可用立即数值取代第2操作数。例如,立即数用前面加一个#的数值常量来表示:
ADD R3,R3,#1 ;R3<-R3+1
AND R8,R7,#&FF ;R8<-R7[7:0]
由第一个例子可以说明,允许源和目的操作数使用同一个寄存器。第二个例子中,&表示该立即数是十六位进制的立即数。
虽然立即数的值是在32位指令字内编码,但不可能将所有可能的32为值作为有效立即数,有效立即数是由一个8位的立即数循环右移2n位得到。汇编器也会用MVN代替MOV、用SUB代替ADD等,这样也可把立即数置于可设置的范围之内。
3)寄存器移位操作
在ARM数据处理指令中,第2操作数还有一种特有的形式——寄存器移位操作,即允许第2操作数在同第一操作数运算之前完成移位操作。例如:
ADD R3,R2,R1,LSL #3 ;R<-R2+8*R1
注意,它是一条ARM指令,在一个时钟周期内执行。许多处理器采用独立的指令提供移位操作,但ARM将它们和基本的ALU操作合并在一个指令中。
例子中,在R1和R2相加之前,先将R1逻辑左移3位,然后再与R2相加,在这里用立即数#3表示移位的位数。可得到的移位操作有LSL、LSR、ASL、ROR和RRX,这些移位操作与移位寻址中的移位操作时相同的。
第2操作数的移位位数除了可用立即数定义外,还可使用寄存器值定义。例如:
ADD R5,R5,R3,LSL R2 ;R5<-R5+R3*2的R2次幂
这是4地址指令。只有R2的低8位是有意义的,但由于移位超过32位不是非常有用,所以这种限制对于许多用途是不重要的。