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

ARM中的汇编指令的更多相关文章

  1. [zhuan]arm中的汇编指令

    http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令)   1. ".text& ...

  2. ARM中的---汇编指令

    一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是"以下是代码段& ...

  3. C表达式中的汇编指令

    C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 a ...

  4. C 表达式中的汇编指令

    asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 asm-qualifier ...

  5. ARM体系结构和汇编指令

    第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...

  6. C/C++中书写汇编指令

    汇编语言的指令格式目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM.NASM,Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法. ...

  7. arm中的ldr指令

    label .equ 0x53000000 ldr r0, label : 将0x53000000地址处的值放入r0中 ldr r0, =label : 将0x53000000付值给r0.

  8. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  9. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

随机推荐

  1. Facebook Cache Token Issue

    https://developers.facebook.com/docs/ios/token-caching-ios-sdk/ What's session? https://developers.f ...

  2. 【CF891C】Envy 离线+最小生成树

    [CF891C]Envy 题意:给你一个图,边有边权,每次询问给你一堆边,问你是否存在一个原图的最小生成树包含给出的所有边.n,m,q<=100000 题解:思路很好的题. 首先有一个非常重要的 ...

  3. [工具] Textify – 复制不可能的窗口内容[Win]

    Textify 是一款 Windows 下的小工具,能够复制那些平时无法复制的内容,比如错误提示.菜单按钮文字等等,只需要按下快捷键就可以随意复制,俗称复制不可能. http://rammichael ...

  4. [C#/Java] C#中调用Servlet示例

    需求 通用消息接口使用servlet作为服务器端服务接口,第三方应用程序通过http post的方式调用servlet,实现与通用消息接口的调用连接. 参数说明如下: msgTitle:消息标题,描述 ...

  5. python unittest框架中addCleanup函数详解

    接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)¶ Add ...

  6. Linux 将进程放入后台执行,解决网络,ssh断开导致进程结束(nohup, setsid, &, disown)

    Linux 将进程放入后台执行,解决网络,ssh断开导致进程结束(nohup,  setsid,  &, disown) 1.nohup 命令 我们知道,当用户注销(logout)或者网络断开 ...

  7. MySql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述): SELECT table_name name,TABLE_COMMENT value FROM INFORMATION_SCHEMA.TABLES WHERE table ...

  8. URL长度过长的问题

    最近项目中很多跨域的问题,有时候跨域要传递很多参数,甚至有时候要传递整个对象,处理的方法是把对象转换成JSON形式的字符串再传递.此时该JSON字符串就比较长,作为参数附加到URL后面,URL就会变得 ...

  9. POJ-1322 Chocolate(概率DP)

    Chocolate Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9279 Accepted: 2417 Special Jud ...

  10. intptr_t、uintptr_t数据类型的解析

    https://blog.csdn.net/cs_zhanyb/article/details/16973379 2013年11月26日 22:20:09 binggo 阅读数:14066   最近开 ...