文章目录
- 前言
- 一、为什么要学习汇编?
- 二、2440下常用汇编指令
- 1. 汇编指令集合
- 2. 2440编译(汇编)工程框架
- 三、汇编指令详解
- 1. mov指令
- 2. mvn
- 3. add、sub、mul、rsb(算术运算)
- 4. and、orr、eor、bic
- 5. cmp、teq、tst
- 5.1 cmp
- 5.2 teq
- 5.2 tst
- 总结
前言
本期和大家主要分享的是ARM指令集,也就是通常所说的汇编;汇编是一门机器语言,比起c语言而言,它更加偏向于底层一点,更加贴切CPU执行任务的流程;并且呢汇编代码是整个ARM代码执行流程中必不可少的一部分;比如通常芯片的启动代码都是运用使用汇编语言所写的;汇编语言的特点是在起初学习时比较晦涩,但是在有了一定的基础之后再去反观像启动代码这样的文件时还是可以看得懂的,为了更好的了解CPU的任务调度以及它执行代码的逻辑顺序,学习汇编语言是至关重要的;接下来我们来看看吧!
一、为什么要学习汇编?
汇编是一门机器语言,比起c语言而言,它更加偏向于底层一点,更加贴切CPU执行任务的流程;并且呢汇编代码是整个ARM代码执行流程中必不可少的一部分;比如通常芯片的启动代码都是运用使用汇编语言所写的;为了更好的了解CPU的任务调度以及它执行代码的逻辑顺序,学习汇编语言是至关重要的;
汇编:机器码的助记符;
注:不同平台下的汇编语言略有差异,基本相同;
二、2440下常用汇编指令
1. 汇编指令集合
2. 2440编译(汇编)工程框架
2440在keil中建立好三星2440A的工程后(注意不添加启动代码,这里由自己编写),下图是汇编的框架:
area reset,code 申请空间,reset段,代码
entry 指定入口
start 入口
mov r1, #3 代码位置
end 结尾
在框架搭建好之后就可以在start之后添加汇编代码了,可以借助仿真器去查看寄存器具体的变化,以及CPSR和SPSR两个功能寄存器的变化,观察汇编指令的作用,并且在此处也可以观察SP,LR,PC,的值,观察异常发生时CPU的处理流程;
三、汇编指令详解
1. mov指令
mov r0, #2 === r0=2
mov r0, r1 === r0=r1
验证的结果如下:
mov指令的作用主要是对某个寄存器进行赋值;
2. mvn
mvn指令的作用是对操作数进行取反;
r1 = ~0;
3. add、sub、mul、rsb(算术运算)
add、sub、mul、rsb分别实现加减乘和反减的功能,寄存器不能够实现除法操作;
通过寄存器窗口可以观察到各个指令的作用;
4. and、orr、eor、bic
and和orr比较常见,实现与和或的功能;eor和bic也是非常重要的两个指令;
eor的作用是异或,可以实现寄存器的某一位取反的功能(比如操作寄存器使用中断实现灯的闪烁,只需要在中断处理程序中对灯的相应位异或1即可);异或指令也可以用来判断两个数或者两个数的某一位是否相等;
bic:位清除指令,清楚第一操作数中第二操作数位1的位;
5. cmp、teq、tst
cpsr寄存器的nzcv表示需要被修改,指令需要加s
5.1 cmp
在观察cmp指令作用的同时观察CPSR中N位的变化;
下面再来看一下,为什么C位会置1呢,这是因为cmp指令的本质就是一个减法指令,所以当R1-R2时没有产生借位,所以这里会置1;哈哈哈,对,就是这么简单;
5.2 teq
用异或测试两个数是否相等;如果相等CPSR的Z位会置位;
5.2 tst
用测试两个数的某一位是否相等;如果相等(结果为0)CPSR的Z位会置位;
到这里呢基本上数据处理类的汇编指令已经练习的差不多了;
总结
本期呢主要分享的ARM汇编指令,这是理解CPU处理程序过程非常重要的一部分内容,在本期分享了ARM汇编指令中的数据处理类的指令,下期呢希望能够和大家分享一下内存操作类的指令,以此呢来实现观察CPSR中中断标志位在程序执行过程中的改变;各位小伙伴们练习起来哦,一定不能只是看看,一定需要大家亲自动手操作一下!
最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!