zoukankan      html  css  js  c++  java
  • ARM指令学习笔记

    ARM指令:

    1.几种简单的和重要的伪指令

             1.AREA:定义一个段,代码段 code、数据段data、自己定义的段

             2.CODE32/CODE16:指令类型32位arm,16位thumb。(不指定,默认为32位arm)

             3.ENTRY:程序入口

             4.EXPORT/IMPORT:export声明一个符号可以被其他文件引用,import在当前文件引用一个其他文件声明的符号(类似于C语言中的exstern)。

             5.EQU:常量定义,相当于C语言中的#define

             6.label:所有顶格写的为标号(只有label可以顶格写),标号就是地址,相当于C语言中的函数名

             7.DCD:连续分配一个字的内存单元(从一个label分配)

             8.DCB:分配一个字节的内存单元

             9.END:源程序结尾(一个源文件必须有一个END,END之后不能再出现汇编文件)

            

    2.程序执行过程

             1.预处理-----生成 (.i)文件

             2.编译---检查语法---生成 (.s)汇编源文件

             3.汇编---由汇编指令助记符翻译成 (.o)二进制文件

             4.链接---将代码中的0x。。。地址填入

    3.MDK的启动代码:最主要的目的为CPU分配各种模式下的堆栈SP

    4.调试  F10 和F11

    5.条件执行及标志位

             1.CMP   更新NZCV的C位。。。。

             2.数据处理指令(mov、sub等)默认不影响条件标志位,但可以选择通过添加“s”来影响标志位。

            

             3.所有可能的条件代码

             4.mov  r2,r1,lsl  #2  执行这段代码,必须考虑一下7步。。。

                       0.作什么操作  (操作码)

                       1.目的寄存器

                       2.源操作数是什么(立即数,寄存器移位获得的数)

                       3.源操作数寄存器

                       4.移位数

                       5.移位的形式(方向)

                       6.是否影响标志 (带S)

    5.分支指令

                       1.B {<cond>} label 跳转到指令B限制在当前指令的正负32Mb的范围内

    6.数据处理指令

    7.逻辑运算的真值表

                       1.异或(EOR)  相异为1,相同为0

                       2.或

    8.位清除   BIC  R0,R0,#9  干掉R0中 与#9,0000  1001 中 1 对应的位。

    9.桶型移位器

                       1.算数右移(ASR),相当于带符号位的除法

    10.立即数  以#号开头的数

                       1.判断一个合法的立即数的方法

                  正好占用一个连续的合法字节 例如:0x100000f

    ②正好连续的3个半字节,如果超过3个半字节,不是立即数

                       0x1fe0000------1fe  0001  1111  1110 前后2个有效字间的个数为<=8 ,但(最低2位半字节)最后两位不是00,所以不是立即数

                      

             11.装载非法立即数

                       1.LDR  rd, = 0xfffffe0e   ldr r0,[PC]    offset  4095

            ldr不受合法立即数的限制,缺点[PC,$offset]offset有范围 正负4095

    6.乘法

    7.单寄存器传送指令

    什么是寻址方式:??

             根据指令中给出地址码字段来实现寻找真实的操作数地址的方式

    8.ARM处理器寻址方式(8种寻址方式)

                       1.立即数寻址  mov  r0,#1  速度最快的操作方式

                       2.寄存器寻址  mov  r0,r1

                       3.寄存器移位寻址 mov  r1,r2,lsl #2

                       4.寄存器间接寻址 ldr  r0,[r1]  数据从 存储器到寄存器

                                                            str  r0,[r1]  数据从 寄存器到存储器

                       5.基址变址寻址(提供3种方式)

                                ①前索引   LDR   R0,[R1,#4] 其中R1为基址寄存器

                                                      STR   R0,[R1, #4]  将R0的值存到新的地址中

                                ②自动索引 LDR   R0,[R1,#4]! “!”表示要回写,更新基址寄存器的值

                                                      STR   R0,[R1, #4] !  回写,新的地址回写到基址寄存器中

                                ③后索引   LDR   R0,[R1],#4取R1地址中的值,存到R0中,然后回写R1

                                                      STR   R0,[R1], #4

                       6.多寄存器寻址      LDMIA  R1!{R2-R7,R12}将R1单元中的数据读出到R2-R7,R12中,R1 自动加1,回写

                                                           LDMIB 

                                                            LDMDA

                                                            LDMDB   PC先减

                                                            使用时:STDIBLDMIA(STDdaLDMib)是配对使用的

                       7.相对寻址

                       8.堆栈寻址

                                1.满增栈FA  满是栈顶指针

                                2.满减栈FD  满是栈顶指针

                                3.空增栈EA

                                4.空减栈ED

                       例如:stmfd  sp!,{r1-r5}

                                  ldmfd  sp!,{r1-r5} 堆栈,入栈退栈的尾缀方式相同

    9.存储器块拷贝

    10.堆栈

    11.SWP指令(存储器的一次读和写的原子操作,通常用于信号量)

             在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。

             SWP  R0,R1,[R2]  读出R2地址中的值放到R0中,同时R1写入R2;

    12.SWI(软件中断)

             通过软件中断号区分一些系统调用的函数(从而决定采用何种操作)。。。。。。

    13.PSR传送指令

             MRS/MSR允许传送CPSR/SPSR中的内容

             MRS {<>}  rd,<psr> 读<psr>中的内容

             MSR{<cond>}  rd,<psr>  写<psr>中的内容 (主要作用可以分位域访问)

    14.协处理器指令

    ATPCS标准。。。ARM公司推出的的一个标准,当函数传参时,func(r1,r2,r3, r4)多余的参数要放到堆中。。。

  • 相关阅读:
    小程序组件化、自定义组件 、自定义组件练习,组件与页面互相传值,插槽(slot)、 component构造器
    小程序事件的介绍、事件对象、事件传值、事件冒泡和捕获,bind和catch的区别
    小程序列表渲染、模板语法、wxml的引入、wxs
    小程序中的常用组件,及组件的共同属性、wxcss、weui-wxss、Mustache语法、逻辑判断wx:if、wx:elif、wx:else
    小程序启动时加载顺序,小程序初始化,页面初始化
    label和input标签在兼容模式下 不能关联?解决方案
    当一个cdn挂掉之后,让加载另一个cdn
    将summernote在vue项目中封装成组件
    wangEditor3富文本编辑器的使用
    git中 连接远程仓库及tag切换的使用
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2347713.html
Copyright © 2011-2022 走看看