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
ARM中的汇编指令的更多相关文章
- [zhuan]arm中的汇编指令
http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text& ...
- ARM中的---汇编指令
一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是"以下是代码段& ...
- C表达式中的汇编指令
C 表达式中的汇编指令 asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 a ...
- C 表达式中的汇编指令
asm 为 gcc 中的关键字,asm 表达式为在 C代码中嵌套汇编指令,该表达式只是单纯的替换出汇编代码,并不对汇编代码的含义进行解析. asm 表达式有两种形式,第二种 asm-qualifier ...
- ARM体系结构和汇编指令
第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...
- C/C++中书写汇编指令
汇编语言的指令格式目前有两种不同的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,比如:MASM.NASM,Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法. ...
- arm中的ldr指令
label .equ 0x53000000 ldr r0, label : 将0x53000000地址处的值放入r0中 ldr r0, =label : 将0x53000000付值给r0.
- ARM中C和汇编混合编程及示例(转)
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
随机推荐
- vue组件定义方式
一.全局组件 <div id="box"> {{msg}} <my-aaa></my-aaa> </div> var Home = ...
- Word 2013无法启用Restrict Editing解决方法
当前文档可能是Mail Merge Letter type document,MAILINGS -> Start Mail Merge -> Normal Word Document保存即 ...
- (转)关于如何学好游戏3D引擎编程的一些经验
此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰 ——阿哲VS自己 QQ79134054多希望大家一起交流与沟通 这篇文章是 ...
- 微信小程序:wx.navigateTo中url无法跳转问题(app.json中配置的tabBar与wx.navigateTo中url引用相同页面导致)
今天在做微信小程序时,设置wx.navigateTo页面跳转并传参数,点击始终没有效果,代码如下: //事件处理函数 newsDetail: function (event) { console.lo ...
- Java.Util.List(List接口)
equals方法 equals(Object o) 方法用来比较指定的对象与列表是否相等,当且仅当指定的对象也是一个列表.两个列表有相同的大小,并且两个列表中的所有相应的元素对相等时才返回 true. ...
- 9.8Django
2018-9-8 14:34:38
- ABP之应用服务(1)
在一个理想的层级项目中,展现层是不能直接访问领域对象的,那么展现层如何获取到自己需要的数据呢?也就是今天的主角-Application层,它的职责就是为展现层服务,它通过仓储获取到相应的数据,然后将数 ...
- java后台设计简单的json数据接口,设置可跨域访问,前端ajax获取json数据
在开发的过程中,有时候我们需要设计一个数据接口.有时候呢,数据接口和Web服务器又不在一起,所以就有跨域访问的问题. 第一步:简单的设计一个数据接口. 数据接口,听起来高大上,其实呢就是一个简单的Se ...
- FZU 2252 Yu-Gi-Oh!(枚举+贪心)
Problem 2252 Yu-Gi-Oh! Accept: 105 Submit: 628 Time Limit: 1000 mSec Memory Limit : 32768 KB ...
- 安装ubuntu16.04系统后没有无线网络选项的解决方法
ubuntu系统是自带有无线网络驱动的,因此最好的解决办法是安装是把联网更新选项勾选上,这样在安装是就能自动把无线网络驱动配置好 这是一个比较有效的解决没有无线网络驱动的方法,比后续按网络上的教程自己 ...