专题3-ARM汇编指令详解
来源:互联网 发布:海信网络 经理 张四海 编辑:程序博客网 时间:2024/06/03 12:59
1、汇编概述
1)为什么要学习使用汇编程序?
bootloader在硬件初始化(启动代码)时用的汇编语言,因为效率更高。linux内核中某些对执行效率要特殊要求的地方也会使用汇编语言。
2)ARM汇编分类
目前常用的ARM汇编指令有两种:
(1)ARM标准汇编:适用于ARM公司的汇编器,适合在windows平台上使用,如ADS中使用。MOV:指令是大写的
(2)GNU汇编:适用于GNU交叉编译工具链中的汇编器,适合于linux平台开发。mov:指令是小写的
(3)汇编程序框架
_start:表示程序的入口(表明属于数据段.section .text ;简洁的汇编代码可以省去.section)
要用.global全局变量来修饰
然后编写一个简单的start.S和Makefile,用eclipse类似实现简单的调试。
start.S:
.text.global _start_start:@mov指令范例 在汇编中是用@来注释的 mov r1,#1 mov r2:#2 mov r3,#3
Makefile:
all:start.o arm-linux-ld -Ttext 0x30000000 -o start.elf $^%.o:%.S arm-linux-gcc -g -o $@ s^ -cclean: rm *.o *.elf
注意上面链接器参数的使用:-Ttext 0x30000000 直接程序运行起始地址,可以省去编写链接器脚本。
2、指令分类学习
1)算术和逻辑指令
1.1 mov 传送
1.2 mvn 传送取反的值
1.3 sub
1.4 and
1.5 orr
1.6 bic 位清除 例如:bic r1,r0,#0b1011
2)比较指令
1.1 cmp比较的结果会影响状态寄存器CPSR的N 和 Z位
执行完mov r1,#2 cmp r1,#2 后:
CPSR最高0x0110,因为两者相等,故N为0,Z为1
1.2 tst:按位与 结果影响CPSR的Z位,结果为0,则Z为1,反之为0
3)跳转类指令
1.1 b:跳转(分支),b条件,如果没有条件,就直接跳
例如:
mov r1,#6mov r2,#5cmp r1,r2bgt branch1 @if(r1>r2) 则跳转到branch1执行;gt是条件执行,是大于的意思add r3,r1,r2 @else 则顺序执行b endbranch1:sub r3,r1,r2end:nop
1.2 bl:带链接返回的跳转
mov r1,#2cmp r1,#1bl fun1 @如果是b,也能跳转到fun1,但是跳完后不能返回到接下来要运行的地址,而bl可以把下一句的地址存储到lr中,方便在完成跳转之后能回到跳转前的位置。mov r1,#2mov r1,#3fun1:mov r1,#2mov r2,#3mov pc,lr
4)移位指令(注意用法)
1.1 lsl:算术移位
用法:
1.2 ror:循环右移(可以观察寄存器的变化)
用法:
5)程序状态字访问指令(不允许mov等指令操作指令,涉及到状态寄存器必须使用msr与mrs来操作)
1.1 msr:将通用寄存器的值搬到状态寄存器
1.2 mrs:与前面相反
6)存储器访问指令
1.1 ldr:将内存的值赋值到寄存器(执行完ldr后发现,r2中的值变为了0xff)
1.2 str:与上面相反(将r1赋值为0x30001000,为内存的地址,然后再下面的memory中手动添加查看内存地址为0x30001000的值的变化)
3、伪指令
4、协处理访问指令
- 专题3-ARM汇编指令详解
- ARM汇编指令详解
- arm汇编 , 指令详解
- ARM 汇编指令详解
- ARM汇编指令详解
- ARM汇编伪指令详解
- ARM汇编指令详解1
- ARM汇编伪指令详解
- ARM汇编指令大全详解
- ARM汇编指令3
- 专题3-ARM伪指令
- ARM 汇编指令(3)
- ARM 汇编指令条件执行详解
- ARM 汇编指令条件执行详解
- ARM 汇编指令条件执行详解
- ARM 汇编指令条件执行详解
- ARM寄存器与汇编指令详解
- 10.ARM汇编指令集详解
- 算法 连续邮资问题
- 数据库传入中文乱码
- Android Fragment 懒加载
- 二分查找套路
- 【气球】关于气球动力与控制的设想
- 专题3-ARM汇编指令详解
- CUDA总结:opencv cuda模块高斯滤波函数分析
- 斐波拉契数列
- Webpack-模块化系统简述
- ionic2混合app开发系列1-环境搭建和ionic2项目目录介绍
- 回首2016,展望2017
- 单例模式
- Leetcode118. Pascal's Triangle (杨辉三角)
- scala 学习(九)——元组和咬合操作