zoukankan      html  css  js  c++  java
  • 常用的汇编指令与技巧

    1.数据传送指令:mov

    move r1,r2     /*r1=r2*/

    move r1,#4096   /*r1=4096*/

    2.大范围的地址读取指令:ldr

    ldr r1,=0x123456789  /*r1=0x123456789*/

    ldr r1,=label         /*获取绝对地址,即label的地址*/

    label:

      ……

    3.内存访问指令(当ldr后面没有=号时为内存读取指令)

    读取指令:ldr

    ldr r1 ,[r2,#4]  /*将内存地址为r2+4的数据读取到r1中,相当于C语言中的*操作*/

    ldr r1,[r2],#4  /*将内存地址为r2的数据读取到r1中,再将地址加4,r2=r2+4*/

    ldr pc,_irq         /*pc=*(_irq)将标号中的内容放入pc中

    _irq:

      .word do_swi

    存储指令:str

    str r1 ,[r2,#4]  /*将r1的值存入地址为r2+4的内存中*/

    str r1,[r2],#4  /*将r1的值存入地址为r2的内存中,再将地址加4,r2=r2+4*/

    4.批量内存访问指令ldm,stm

    格式:ldm {cond}  <addresing_mode>  <rn> {!}  <register list> {^}

       stm {cond}  <addresing_mode>  <rn> {!}  <register list> {^}

    格式说明:

    1){cond}:表示指令的执行条件,根据cpsr寄存器中的条件标志位决定是否执行该条指令,每条ARM指令包含4bit的条件码域,

    可以定义16个执行条件,具体如下表:

     2)<addresing_mode>表示地址变化模式,具体如下:

    3)<rn> 中保存内存的地址,如果后面加上!,指令执行完成后,rn的值会更新,等于下一个内存的地址,否则保持初始值。

    4)<register list>表示寄存器列表,对于ldm指令,从<rn>所对应的内存块中读取数据写入这些寄存器,对于stm把这些寄存器的值写入

    <rn>对应的内存块中。如果寄存器地址连续,可以写成r1-rx的格式,不连续的用逗号隔开。^符号有两种含义:如果<register list>有pc寄存器,

    它表示指令执行后,spsr寄存中的值将自动复制到cpsr寄存器中--这通常用于中断处理函数的返回;如果没有pc寄存器,那^表示操作的是

    用户模式下的寄存器,而不是当前特权模式下的寄存器。

    5)指令中<register list>与<rn>的对应关系为:编号低的寄存器对应内存中低地址单元,编号高的寄存器对应内存中高地址单元,具体如下:

     扩展:

     ldmfd

     stmfd

    5.算术指令

    加指令:add 

    add r1,r2,#1    /*r1=r2+1*/

    减指令:sub 

    sub  r1,r2,#1    /*r1=r2-1*/

    乘指令:mul 

    mul r1,r2,#4    /*r1=r2*4*/

    6.程序状态寄存器的访问指令 

    msr cpsr, r0   /* s<-r,r0的值复制到cpsr中*/  

    mrs  r0,cpsr   /*r<-s,将cpsr的值复制到r0中*/

    7.相对跳转指令b,bl

    1)这两条指令的区别在于bl除了跳转以外,还将返回地址(bl的下一条指令地址)保存在lr寄存器中

    2)这两条指令的跳转范围是当前指令前后32M范围内

    3)他们是位置无关的指令,相对跳转

    e.g:

    b fun1

    fun1:

      bl fun2

    fun2:

      ..............

    扩展:绝对跳转 ldr pc,=xxx

    直接将要执行的指令地址存入pc中,pc为程序计数器,指向当前指向位置

     8.其他指令

    比较指令:cmp

    cmp r1,r2 /*根据对比的结果设置cpsr寄存器的标志位,参考ARM指令条件码表

    逻辑指令

    位与:and(相当于&)

    and r0,r1,#0xff   /*r0=r1&0xff*/

    位或:orr(相当于|)

    orr r0,r1,#0xff   /*r0=r1|0xff*/

    清零:bic 

    bic r0,r0,#0x03  /*将r0中的第一位和第二位清零*/

    测试:tst 

    tst r0,#0x20  /*测试第六位是否为0,为0则将cpsr的Z位置1*/

  • 相关阅读:
    mysql库操作
    mysql初识
    numpy科学计算库
    pycharm下安装numpy
    Kettle汇总时参数
    PL/SQL连接查询数据报错时Dynamic Performance Tables not accessible
    HBase Shell输入命令无法删除问题解决技巧
    linux系统利用yum安装其他软件或服务
    Web安全测试
    用户名和密码测试
  • 原文地址:https://www.cnblogs.com/FREMONT/p/9439665.html
Copyright © 2011-2022 走看看