zoukankan      html  css  js  c++  java
  • 常用的ARM指令

    数据处理指令

    • 数据传输指令 mov mvn
    • 算术指令 add sub rsb adc sbc rsc
    • 逻辑指令 and orr eor bic         //与或非
    • 比较指令 cmp cmn tst teq
    • 乘法指令 mvl mla umull umlal smull smlal
    • 前导零计数 clz        (用的不多)

    详细分析:

    • mov r1, r0        @两个寄存器之间数据传递,r0赋值给r1
    • mov r1, #0x0    @将立即数赋值给寄存器,0赋值给r1

    mvn和mov用法一样,区别在于,mvn是按位取反后在赋值

    譬如:r1 = 0xff,

      (1)mov r0, r1后,r0 = 0xff;

      (2)mvn r0, r1后,r0 = 0xffff00;   

    • bic        bic r0, r0, #0x1f             @读出r0中的bit0到bit4清零后赋值给r0
    • cmp       cmp r0, r1  等价于 sub r2, r0, r1    @比较指令天生就会影响cpsr的标志位
    • cmn       cmn r0, r1   等价于 add r2, r0, r1
    • tst        tst r0, #0xf               @测试r0的bit0~bit3是否全为0

    常用ARM指令2:cpsr访问指令

    • mrs & msr
    • mrs用来读psr,msr用来写psr
    • CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。
    • cpsr和spsr的区别和联系:cpsr是程序状态寄存器,整个SOC就只有一个,而spsr有5个

    举例:

    •   @mrs r0, cpsr      @把cpsr中的读取到r0中
    •   @bic r0,r0,#0x1f     @将低5位清零,
    •   @orr r0,r0,#0xd3    @11010011,禁止中断和快速中断
    •     @msr cpsr, r0       @把r0的值写入cpsr
    •   msrcpsr_c, #0xd3     @把cpsr的特定位改成0xd3。本句代码效果等价于上面4句

    常用ARM指令3:跳转(分支)指令

    • b & bl & bx
    • b 直接跳转(就没打开算返回)
    • bl (branch and link),跳转前把返回地址放入lr中,以便返回,以便用于函数调用
    • bx跳转同时切换到ARM模式,一般用于异常处理的跳转。

    常用ARM指令4:访存指令

    • ldr/str & ldm/stm & swp
    • 单个字/半字/字节访问 ldr/str    
    • 多字批量访问 ldm/stm
    • swp r1, r2, [r0]
    • swp r1, r1, [r0]

    ARM汇编中的立即数

    • 合法立即数与非法立即数
    • ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分。
    • 合法立即数:经过任意位数的移位后非零部分最终可以用8位表示的,即为合法立即数

    常用ARM指令5:软中断指令

    • swi(software interrupt) 软中断指令用来实现操作系统中系统调用

    别人整理的不错的文章: http://www.360doc.com/content/14/0725/00/18635950_396855885.shtml

  • 相关阅读:
    利用GitHub+Node.js+Hexo搭建个人博客(一)
    更丰富的符号工具包 Font Awesome
    Markdwon入门2
    Codechef:Fibonacci Number/FN——求通项+二次剩余+bsgs
    二次剩余理论
    基姆拉尔森公式和蔡勒公式(计算星期几)
    幂方程(模意义下)
    etcd
    mysql group by
    UUID
  • 原文地址:https://www.cnblogs.com/jxjl/p/6971544.html
Copyright © 2011-2022 走看看