凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

ARM数据处理操作

已有 488 次阅读| 2016-2-16 17:30 |个人分类:linux技术

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

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-20 04:23 , Processed in 0.034862 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部