zoukankan      html  css  js  c++  java
  • arm汇编指令总结(不断更新)

    /**
    ******************************************************************************
    * @author    Maoxiao Hu
    * @version   V1.0.1
    * @date       Jan-2015
    ******************************************************************************
    * < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >
    ******************************************************************************
    **/

    本文会不时完善和纠正一些小错误,还请到 http://www.cnblogs.com/humaoxiao 参考最新版本。
     
    ARM的指令集去哪里查才最权威最详细呢?
    一般ARM官方网站上会有针对你手上芯片对应指令集的《架构参考手册》,可以免费下载。例如我手上的exynos4412是ARM v7-A指令集,那么对应的手册就是《arm_architecture_reference_manual ARMv7-A and ARMv7-R edition.pdf》。
    在这个手册的第A8节:Instruction Details 按照字母顺序详细介绍了ARMv7-A的各种指令语法,700页之多,用到时详查即可。
    下面说一下查阅文档需要注意的几个地方。

    一、指令格式

    当我们查找一些指令比如ldrle movne,发现无法在手册中搜索到,其实并不是没有这些指令,而是这些指令是在原始指令ldr mov后面加上了条件码(Condition Code)le ne,然后被写到了一起。
    举个例子:
    LDR的第一种指令格式如下,LDR后面的<c>就表示可以选择后接条件码,当然也可以不接。
     
    NewImage
     
    条件码如下,如果不附加条件码,就代表AL,无条件执行:
    NewImage
     
    这样一来,一个简单的ldr就可以派生出ldreq ldrne ldrcs ldrcc……各种指令,其它简单指令也类同。
    知道了这点,99%的指令就都可以读得懂了,还有极小一部分特殊指令在这里暂且不说。
     
     
    二、常用指令
    列一下uboot中经常出现的一些指令,作为练习,按字母顺序依次列出。
    而且平常所说的什么位置无关码,其实不用死记,可以直接用指令格式进行解释。
    ----------
    b
    NewImage
    举例:
    NewImage
    第一行 b 7de016d0的汇编码是ea000002,与上表对照后发现imm24为2,也就是说目的地址为当前PC+4+2*4 = 7de016d0
    即汇编码里只存储了偏移地址,所以b是位置无关码,至于b的跳转范围,很明显就是24位有符号数能表示的范围。
    -----------
    bl
    NewImage
    只不过bl会把当前地址+4放到LR寄存器中以备程序返回。
    ------------
    bx
    bx指令跳转到指令中所指定的目标地址。一般这条指令用于程序返回,比如:bx lr
    NewImage
    举例:
     
    ------------
    blx
    blx将跳转到Rm寄存器指向的地址,并将当前PC值保存到LR。低四位代表Rx的寄存器号。
    NewImage
    举例:
    NewImage
    既然跳转到r4指向的寄存器,那么低四位就是4,高28位一般固定为e12fff3。
    -------------
    ldr
    ldr是把逗号后面地址指向的值,放到逗号前面的寄存器里去。
    NewImage
    举例:
    NewImage  r1 + 4 -> r5
    NewImage r3 -> r2
    NewImage r3 - 36 -> r2
    NewImage pc + 292 -> r0
    --------------
    str
    str的作用是把逗号前面寄存器的值,放到逗号后面指示的地址里去。
    NewImage
    举例:
    NewImage r3 -> sp + 28
    NewImage r3 -> r2 + r1<<5
  • 相关阅读:
    洛谷P4550 收集邮票 期望dp
    Codeforces Round #748 (Div. 3) G. Changing Brackets
    [Codeforces Round #748 (Div. 3)](https://codeforces.com/contest/1593) F. Red-Black Number 记忆化搜索
    [Codeforces Round #748 (Div. 3)](https://codeforces.com/contest/1593) D2 Half of Same
    HDU 3746 Cyclic Nacklace kmp找循环节
    Codeforces Round #747 (Div.2) D. The Number of Imposters
    Nand2tetris 学习笔记
    怎样解题表
    [省选]知识点板块
    List of Problems to be Solved
  • 原文地址:https://www.cnblogs.com/humaoxiao/p/4211581.html
Copyright © 2011-2022 走看看