汇编工程文件中的内容
汇编文件中的符号
---------------------
1. 伪操作 :伪操作不占用代码段的空间,给编译器使用
.text .global .globl .end .if .else .endif .data .word .short .byte
不同的交叉编译器,对应的伪操作不同。
2. 汇编指令 :编译器可以将其编译生成32位的机器码,执行汇编指令可以完成一定的功能。
3. 伪指令 :伪指令本身不是一条汇编指令,但是编译器可以将其编译生成多条汇编指令,
共同完成一条伪指令的功能。
4. 注释 :
单行注释 : @
多行注释 :
.if 0/1
.else
.endif
编译器的不同,单行注释方式也不同。
--------------------------------------------------
汇编指令的分类
------------------------
1. 数据操作指令
1> 数据搬移指令
2> 移位操作指令
3> 位运算指令
4> 算数运算指令
5> 比较指令
2. 跳转指令
3. Load/Store内存读写指令
4. 特殊功能寄存器读写指令
5. 软中断指令
汇编指令的学习,可以参考ARM-v7架构的手册。
ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf
---------------------------------------------------------
汇编指令的最基本的语法格式
-----------------------------
<opcode>{Cond}{S} Rd, Rn, oprand_shifter
解释:
<opcode> : 指令码(指令名字) , 比如mov add sub mul and
{cond} : 条件码, 实现汇编指令的有条件执行
{S} : 状态标志
指令加S, 指令的执行结果影响CPSR的NZCV位
指令不加S, 指令的执行结果不影响CPSR的NZCV位
Rd : 目标寄存器,只能是一个普通的寄存器, R0-R15
存放指令的执行的结果
Rn : 第一个操作寄存器,只能是一个普通的寄存器, R0-R15
可以看成运算符的左操作数
oprand_shifter : 第二个操作数
1> 可以是一个普通的寄存器
2> 可以是一个立即数
3> 可以是一个经过移位操作的寄存器
<opcode>{Cond}{S} : 书写时连到一起写
Rd, Rn, oprand_shifter : 书写时使用英文逗号隔开
<opcode>和Rd之间使用空格隔开
每条汇编指令单独占用一行,汇编文件中不严格区分大小写。
MOV R0, #0xFF <==> mov r0, #0xff <==> MoV R0, #0xFF
--------------------------------------------------------------
寄存器与指令流水线
寄存器是计算机中的一种存储器件,
它们通常被用来存储CPU需要快速访问的数据。
寄存器没有地址是因为它们是CPU内部的一部分,
不需要通过地址来进行访问。
CPU可以直接访问寄存器,而不需要通过地址总线和数据总线来进行访问。
因此,寄存器是一种非常快速的存储器件,可以提高计算机的运行效率。
--------------------------------------------------------------
特殊功能寄存器的介绍
-----------------------
R13寄存器(栈指针寄存器)
------------
作用:栈指针寄存器中存放的是栈指针指向栈空间的地址。
栈空间的作用:压栈保存现场,出栈恢复现场。
------------------------------------
R14寄存器(链接寄存器)
------------------------------
作用:链接寄存器中保存的是程序的返回地址,
跳转指令的下一条汇编指令的地址;
-------------------------------------
R15寄存器(程序计数寄存器)
-------------------------------
作用:程序计数寄存器中存储的是当前取指指令的地址,
当完成指令的取指操作之后,
PC寄存器会自动加4指向下一条汇编指令,
一条汇编指令占4字节空间。
-----------------------------------------
CPSR寄存器(当前程序状态寄存器)
----------------------------------
作用:CPSR寄存器中保存的是当前程序的运行的状态,
比如:ARM处理器的工作模式
------------------------------------------
SPSR寄存器(保存程序状态寄存器)
----------------------------------
作用:SPSR寄存器是专门用来对CPSR寄存器进行备份的。
-----------------------------------------
CPSR寄存器的详细介绍
------------------------
N[31] : 指令的执行结果为负数时,N位被自动置1,否则清0.
Z[30] : 指令的执行结果为零时,Z位被自动置1,否则清0.
C[29] :
加法:产生进位时,C位被自动置1,否则清0.
进位:低32位向高32位进位
减法:产生借位时,C位被自动清0,否则置1.
借位:低32位向高32位借位
由于每个寄存器都是32位的,及一个寄存器中可以存储一个32位的数据,
32位以内的数据进行加减法运算时,不要考虑进位和借位的问题。
一条汇编指令可以完成32位以内数据的运算。
V[28] : 符号位发生变化时, V位被自动置1,否则清0.
I[7] : IRQ屏蔽位
I = 0 :不屏蔽IRQ中断
I = 1 :屏蔽IRQ中断
F[6] : FIQ屏蔽位
F = 0 :不屏蔽FIQ中断
F = 1 :屏蔽FIQ中断
T[5] : 状态位
T = 0 : ARM状态,执行的ARM汇编指令
T = 1 : Thumb状态,执行的Thumb汇编指令
ARM指令,每条汇编指令的机器码占4个字节
Thumb指令,每条汇编指令的机器码占2个字节
M[4:0] : 模式位
-------------------------------------------------------
指令流水线
-----------------
为了提高指令的执行效率,指令采用流水线的方式进行执行。
三级流水线,五级流水线,七级流水线,八级流水线,十三级流水线 ....
本次课程重点讲解三级流水线:
------------------------------
取指器:
--------------
根据PC寄存器中的值,完成汇编指令的取指的操作,并转交给译码器。
-------------------------------------------------------------
译码器:
-------------
对汇编指令的机器码进行译码,并交给对应的执行器,执行汇编指令。
--------------------------------------------------------------
执行器:
-------------
执行汇编指令,并将指令的执行结果写回到寄存器中。
-------------------------------------------------
以上三个器件是完全独立的,工作互不干扰,都属于单周期的器件。
指令的周期 = 9 / 7 = 1
以下指令的流水线是理想情况下的指令流水线,函数的调用,异常的处理
会打断指令的流水线。