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*/

  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/FREMONT/p/9439665.html
Copyright © 2011-2022 走看看