查看: 1333|回复: 0
打印 上一主题 下一主题

[ARM资料] ARM数据处理操作

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

本资料供同学们学习使用

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表