ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方。

 
    一、ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指令都可以是有条件执行的。
   
    二、ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他的指令都是基于处理器内部的寄存器操作完成的,这和INTEL汇编是不同的,初学者很不易理解。
  
    三、指令的后缀:
    "S"  可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码。很多初学着不知道怎么更新,若这条指令执行完以后,对ARM程序状态寄存器的条件码标志(N,Z,C,V)的影响。
    "! " 表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。
         如:LDR R0, [R1, #4] 他相当于 R0 <- mem32[R1+4]
                                      R1 = R1+4; 
    "^"  LDMFD R13!, (R0-R3, PC)^ //"^"表示一条特殊形式的指令。(在从存储器中装入PC的同时,CPSR也得到恢复)。
 
    四、#号后面加0x或&表示十六进制:#0xFF, #&FF
        #号后面加0b表示二进制。
        #号后面加0d表示十进制。   
*******************************************************************************
 
    五、立即数寻址
    每个立即数都是采用一个8位的常数循环右移偶数位间接得到。
    初学者不易理解:一个32位的指令不可能全部用来保存32位的立即数,所以从指令的编码格式上分析,在指令编码中只分配了12位来存储立即数,其中4位用来保存右循环值,8位用来保存一个常数,所以并不是每一个32位的立即数都是合法的。
 
    六、寄存器寻址
    ADD R3,R2,R1,LSR #2 //寄存器R1的内容右移了两位,但是注意本指令执行完毕以后R1的内容并不改变。
 
    七、前变址、自动变址和后变址
    1、前变址:LDR R0,[R1,#4]   //R1寄存器的内容先加4,然后执行操作,但操作完毕以后,R1的内容不变。
    2、自动变址:上面总结指令后缀时提到"!",表示自动变址(参考上面 三 )。
    3、后变址:LDR R0,[R1],#4   //先进行操作然后R1+4->R1,操作完毕后,R1 = R1+4。不需要"!"号。
 
    八、堆栈寻址
    一定要注意:堆栈操作总是要指定自动变址的,否则会覆盖以前保存的内容。
********************************************************************************
 
    九、乘法指令
    1、乘法指令不支持第二操作数为立即数。
    2、结果寄存器不能同时作为第一源寄存器。
        32位:MUL Rd,Rm,Rs
              MUL Rd,Rm,Rs  //Rd和Rm不能为同一寄存器
        64位:MUL RdHi,RdLo,Rm,Rs //RdHi、RdLo和Rm不能为同一寄存器,RdHi和RdLo不能为同一寄存器。
 
    十、跳转指令
    1、BL和BLX跳转是硬件自动将下一条指令地址保存到LR(R14)中,不需要自己写指令。
    2、当指令跳转到32MB地址空间以外时,将产生不可预料的结果。
 
    ARM的指令集比较简单,肯定还有其他需要注意的地方,欢迎网友们积极参与补充。

ARM指令集学习总结-转载的更多相关文章

  1. ARM指令学习,王明学learn

    ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令    2.— MVN 数据取反传送指令    3.— CMP 比较指令    4.— CMN 反值比较指令    5.— TST 位测试 ...

  2. ARM指令集----杂项指令

    ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...

  3. ARM指令集----寻址方式

    ARM指令集可以分为跳转指令,数据处理指令,程序状态寄存器传输指令,LOAD/Store指令,协处理器指令和异常中断产生指令6类 ARM指令集的寻址方式 数据处理指令的操作数的寻址方式 字以及无符号字 ...

  4. 对arm指令集的疑惑,静态库运行,编译报错等问题

    转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...

  5. Android ARM指令学习

    在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...

  6. ARM寄存器学习,王明学learn

    ARM寄存器学习 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式. ...

  7. ARM指令集(上)

    ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1  指令格式         (1)基本格式       ...

  8. ARM指令集相关知识

    1.ARMv8引入了执行状态机制,分为AArch32和AArch64 AArch32为T32(Thumb)和A32(ARM). AArch64为A64一种指令集 A64和A32的指令都是32位宽,可以 ...

  9. ARM指令集——条件执行、内存操作指令、跳转指令

    ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...

随机推荐

  1. H5的新应用-获取用户当前的地理坐标

    ------------------------------ <script type="text/javascript">                       ...

  2. log4j.xml(信息打印)

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SY ...

  3. shell之路【第二篇】运算与文件调用

    Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 原生bash不支持简单的数学运算,默认都是字符串操作,但是可以通过其他命令来实现 算数运算 expr. ...

  4. 关于video.js

    网址:http://www.cnblogs.com/webenh/p/5815741.html

  5. openCV(四)---Canny边缘检测

    图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘. 直接上代码,函数简介都在代码注释中 //canny边缘检测 -(void) ...

  6. linux学习的哲学层面的思考-架构

    参考:http://blog.chinaunix.net/uid-26119273-id-3356414.html 学习Linux,准备做产品的话,不要把Linux当成了终极目标(当然,这是对应用而言 ...

  7. oracle递归查询子节点

    通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节 ...

  8. Exams

    Exams time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...

  9. T-shirts Distribution

    T-shirts Distribution time limit per test 1 second memory limit per test 256 megabytes input standar ...

  10. Form表单的post 和get跳转区别

    post是隐示请求 ----- 安全 get显示请求不安全,会在URL上显示路径和参数