飞道的博客

ARM汇编指令集

378人阅读  评论(0)

一、指令与伪指令:
1、汇编指令是CPU机器指令的助记符,经过编译后会得到一串01组合的机器码,可以由CPU读取执行。
2、伪指令本质不是指令(只是和指令一起写在代码中)它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码,在编译过程中起作用,指导编译,在整个过程有作用但经过编译后不存在了,辅助编译器把指令加工成机器码。伪指令好像做饭用的工具,而指令像菜米原材料,加工好的饭就是机器吗。
二、两种不同风格的ARM指令
1、ARM官方风格:指令一般用大写。
2、GNU风格的ARM指令:指令用小写字母,linux常用。
三、ARM指令特点:
1、ldr / str架构:ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中的内容加载入CPU中通用寄存器中才能被CPU处理。
(1)、Ldr指令:将内存内容加载入通用寄存器。
(2)、Str指令:将寄存器内容存入内存空间中。
(3)、Ldr / str组合用来实现CPU和内存数据交换访问内存先将内存数据读入CPU的(37个通用寄存器)的某个里,然后处理完,再传回内存。
2、8种寻址方式:
(1)、寄存器寻址:(寄存器之间通信)
寄存器寻址:mov r1, r2把r2里面的内容送到r1里,相当于C语言r1=r2赋值。

立即数寻址:mov r0, #0xFF00 把#0xFF00这个数字放入r0里,相当于C语言的 r0 = 0xFF00赋值。

寄存器移位寻址:mov r0, r1, |s|, #3 把r1里存的数左移3位放入r0中。相当于C语言的r0 = (r1 乘2的三次方)。

(2)、寄存器与内存通信:
寄存器间接寻址:ldr r1, [ r2 ] 把r2寄存器中存的是一个内存地址,把这个地址放的内容读入r1中。相当于C语言 a = *p。

基址变址寻址:ldr r1, [ r2, #4 ] 把以r2为基地址加4的地址里放的数据读取r1。相当于C语言: a = *( p + 4 )。

多寄存器寻址:ldmia r1!, { r2 —r7, r12 } r1里是一个内存地址,以r1为起始地址依次把r2----r7和r12加载入内存里。

堆栈寻址:stmfd sp!, { r2----r7, r10 }从栈上访问多个字节往寄存器放,压栈,ldmia是弹栈。
注意:[ ]代表访问的是内存。

相对寻址死循环例: .beg flag
flag:
简化 b.
Flag: 标号类似函数名,用作跳转,C语言go to就是标号。
3、指令后缀:
(1)、同一指令经常附带不同后缀,变成不同指令,经常使用的后缀有:B(byte)功能不变,操作长度变为8位,指令位数。
H(half word)功能不变,长度变为16位。
S(signed)功能不变,操作数变为带符号数。
如:ldr, ldrb(功能不变,指令变为8位) ; ldrh(功能不变指令变为16位); ldrsb(功能不变指令变为带符号8位); ldrsh(功能不变指令变为16位有符号表示)。
S(S标志):功能不变,影响CPSR标志位,如mov后加S会影响CPSR条件位N、Z、C、V。
4、条件执行后缀:
N、Z、C、V 均为CPSR条件标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行(条件后缀)。
例: moveq r0, r1
如果eq后娺成立,则直接执行mov r0, r1这条指令,如果eq不成立本名代码不执行。类似于C语言if( eq ) r0 = r1;
条件后娺注意2点:
(1)、条件后缀是否成立,不是取决本句代码,而是取决于这句代码之前的代码运行结果。
(2)、条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行。
5、多级指令流水:
ARM汇编为增加处理指令流水的速度,使用多级流水线,下图为三级流水线工作原理示意图(S5PV210使用13级流水线,ARM11为8级)。
————允许多个操作同时处理,而非顺序执行。

注意:PC指向的是取指令的地址,也就是:执行地址+8 = PC
如果从SVC模式中跳转到IRQ模式,那么返回地址会保存在IRQ模式下的lr寄存器,也就是保存PC的值,那么再返回的时候,应该去执行的指令应该是PC - 4处的指令,也就是跳转之前的正在译码的指令 。
什么是指令流水:在ARM CPU内部有个并行处理器,有取指、解码、执行三个模块,在每一个CPU单元这三个模块都会被执行,比如第一个CPU时钟周期,第一句代码被取指,在第2个CPU时钟周期,第一句代码被解码,第二句代码被同时取指。循环工作,分时实现并行处理指令,每句代码经过三个CPU时钟,但每个CPU时钟都会有一条指令被执行完成。
流水线过多一但被打断重新填满流水线就比较复杂。流水线被打断:意思是一条流水线加载了一条指令运行到第8步还没结束,结果跳转了,因此前面执行的指令都不能用了,到跳转处重新执行,ARM采用条件预测防打断。


转载:https://blog.csdn.net/qq_41680432/article/details/116212176
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场