ARM数据处理操作

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位不是非常有用,所以这种限制对于许多用途是不重要的。

银火虫 发表于05-31 15:27 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

银火虫
银火虫(中将)
金币:5919个|学分:6733个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号