• ARM中的汇编指令


    Arm指令,32位的指令集,一共有16条的基本指令,每条指令都可以按条件执行,

      指令都是32bit的,高四位是条件码[31:28],

      

    Thumb指令,16位的指令集,执行效率比arm指令集要低,但是节省了系统的存储空间,兼容了16位的数据总线宽度的应用体系。

      thumb指令,相比较与arm代码,储存器的功耗也较低。

      thumb指令,基本都是无条件的,一共有18条基本指令,全部指令都是16bit。

    Thumb-2指令,由16bit、32bit的指令混合组成,一共有16条基本指令,

    BIC:ARM指令,对某些位,清零。先取反再相与。

             asm("BIC  r2, r2, #0x1f");        ##对R2的低5位清零。

    ORR:ARM指令,逻辑或

             asm("ORR r2, r2, #0x10");       ##R2逻辑与0x10。

    MRS:asm("MRS  r2, CPSR");          ##将CPSR的值加载到R2中。

    MSR:asm("MSR  CPSR, r2");          ##将R2的值加载到CPSR中。

    asm(" SWI 0x0");           ##跳转到软件中断函数,并转换为SVC模式。

    LDR:{条件}目的寄存器 存储器寄存器。将存储地址所指的4个字节数据传送到寄存器,其中寻址方式会有很多种。

             asm("ldr r0,=0xddeeaabb");        ##在这里ldr是一个伪指令,相当于move指令。

             asm("ldr r0, [r1]");           ##将存储器地址为r1的一个字的数据加载到r0中。

    MRC与MCR:在处理器寄存器与协处理器寄存器之间交换数据

             MRC {cond} coproc, opcode1, Rd, CRn, CRm {,opcode2}

             asm("mrc p15,0,r0,c1,c1,0");   ##在CRn, CRm均为c1, opcode均为0时,表示SCR

                                                               (Secure Configuration Register),表示将c1的值赋值给r0.

             asm("mcr p15,0,r0,c1,c1,0");   ##将r0的值赋值给c1.

             asm("mcr p15,0,r0,c12,c0,0");   ##将r0的值赋值给c12,此时c12表示VBAR,

                                                                    Vector Base Address Register,存放异常时的入口地址。

    SMC:(Secure Monitor Call).    asm(" SMC 0x0");       ##将ARM core切换到Trust Zone模式。

            asm("mov r2, r2, lsr, #4");    ##r2左移4位后,加载到r2中。

            asm("str r3, [sp, #-4]");      ##将r3中的数据加载到堆栈中,堆栈顶指针向前移4.

            asm("ldmia r0!, {r3-r10}");      ##ldmia多寄存器加载指令,将r0地址中的数据加载到r3中,且每次r0增加4.

                                                               !表示,最终r0的值会改变。

            asm("SVC 0x0");    ##arm core转为Supervisor模式。

    asm(),告知编译器,该语句是汇编语句。

    lea,load effective address,取有效的偏移地址;

    gnu汇编中的一些符号:

      @ 用来表示注释,可以在行首,也可以在代码之后,类似于//

      # 做注释,一般放在行首

      :以冒号结尾的,表示标号

      . 点号在gnu汇编中表示当前指令的地址

      # 立即数前要加#或者$,表示这个是个立即数

    常用的gnu伪指令

      .global _start    @给_start外部链接属性。

         .section .text     @指定当前段是代码段。

      .ascii,.byte,.short,.long,.word,.quad,.float,.string     @表示当前数据的大小,定义数据

      .align 4   @以16自己对齐

      .balignl 16  0xabcdefgh     @以16字节对齐填充

      .end  @表示文件结束

      .include @头文件包含

      .arm、.code32   @声明以下为arm指令

      .thumb、.code16  @声明以下为thumb指令。

      nop   空操作。

      ldr     大范围的地址加载指令,与程序链接时给定的地址有关,

      adr   小范围的地址加载指令,总是以PC的值作为基准来表示地址。

    arm中异常向量表的初始化,放在汇编中。

    .global  _start

    _start:

      b reset;    //复位为0x0000_0000

      ldr  pc, _undefined_instruction;     //这时pc为0x0000_0004,其中的值变为label _undefined_instruction的值;

      ldr  pc, _software_interrupt;

      ldr  pc, _prefetch_abort;

      ldr  pc, _data_abort;

      ldr  pc, _not_used;

      ldr  pc, _irq;

      ldr  pc, _fiq;

    中断向量表的入口程序地址,通过.word来拿到;

      _undefined_instruction:   .word  undefined_instruction;

      _software_interrupt:   .word  software_interrupt;

    .word将这个_undefined_instruction的值,定为undefined_instruction的值;

    undefined_instruction:  //程序链接的时候,确定值

      get_bad_stack

      bad_save_user_flags

      bI do_undefined_instruction    //只是定义一个跳转函数

      .align  5

  • 相关阅读:
    OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
    Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持
    PDF.NET 开发框架之 SOD框架 Ver 5.2 正式版开源源码发布
    变态的儿童国学教育与孔子真正的教育之道
    .net字符串数组查找方式效率比较
    Oracle根据字段值找到表名和列名
    Oracle卸载后手工删除内容
    Oracle服务启动顺序导致ORA-12514
    mysql由于权限问题看不到用户数据库
    MySql无法远程登录以及IP被锁解决办法
  • 原文地址:https://www.cnblogs.com/-9-8/p/4504395.html
Copyright © 2020-2023  润新知