arm汇编知识点

来源:互联网 发布:青果软件 刘萍 编辑:程序博客网 时间:2024/06/05 04:15
从异常中断处理程序中返回需要的步骤:
①所有修改过的用户寄存器必须从处理程序的保护堆栈中恢复(出栈)
②将SPSR_mode寄存器内容复制到CPSR中,使得CPSR从相应的SPSR中恢复,即恢复被中断的程序工作状态.
③根据异常类型将PC变回到用户指令流中(中断之前的)相应指令处
④清除CPSR中的中断禁止标志位I/F.

异常中断向量表
中断向量表中指定了各异常中断与其处理程序的对应关系.()

ARM汇编语言的伪指令

ADR ADR{cond} register,expr 将基于pc或基于寄存器的地址值读取到寄存器中.小范围的地址读取.
将某一个地址装到寄存器里去,\
装载表达式的值
子程序的地址


ADRL ADRL{cond} register,expr 将基于pc或基于寄存器的地址值读取到寄存器中,中等范围的地址读取.
地址装载
比如使用的子程序在另一个文件中定义
引用c程序中相关的地址名


LDR LDR{cond} register,=[expr|label-expr] 将一个32位的立即数或者一个地址值读取到寄存器中.大范围的地址读取
间接寻址
NOP(相当于c语言的sleep)


ARM汇编语言语句格式


ARM汇编语言是以段为单位来组织源程序的.
(程序)
段是相对独立的,具有特定名称的,不可分割的指令或者数据序列.
端又可以分为代码段和数据段.
代码段存放执行代码
数据段存放代码运行时需要的数据.
一个ARM源程序至少需要一个代码段,
大的程序可以包含多个代码段和数据段


AREA EXAMPLE,CODE,READONLY(首先说明代码的入口点(在代码段中说明)入口点用ENTRY说明,AREA标识这是一个段,EXAMPLE是代码段的标识名,CODE表示代码段,DATA表示数据段,READONLY表示对代码段的读写属性,ENTRY是整个入口点,start表示一个标识,END标识汇编语言的结束)
ENTRY
start
MOV r0,#10
MOV r1,#3
ADD r0,r0,r1
END


ARM数据处理操作
ARM数据处理有三种形式
简单的寄存器操作
立即数操作MOV
寄存器移位操作 左移右移
其中32位立即数在32位指令中的编码以及ARM特有的寄存器移位操作是数据处理的难点


设置条件码
ARM的任何数据处理指令都能通过增加"S"操作码来设置条件码(NZCV)
条件执行
ARM指令集不同寻常的特征是每条指令都是可以条件执行的.
条件转移(基本的跳转指令B或BX BL)
在程序中可以通过条件码的使用让微处理器决定是否进行转移,还可用来控制循环的退出.


汇编语言子程序调用及返回
子程序的调用
在ARM汇编语言中子程序调用是通过BL指令来完成的
BL subname(子程序的名称)
子程序的返回
在返回调用子程序时,转移链接指令保存在LR寄存器中(R14)中的值需要拷贝回程序寄存器PC(R15)


子程序返回的方法
对于最简单的子程序,一条MOV指令就可以完成子程序的返回
SUB2
MOV pc,r14;把r14拷贝到r15来返回
对于在子程序中出现嵌套调用时,链接寄存器LR中的返回地址可能会在第二次调用时覆盖,所以需要通过将返回地址压入堆栈来进行保存
SUB1  STMFD r13!,{r0-r2,r14}//保存工作寄存器和链接
BL SUB2
LDMFD r13!,{r0-r2,PC}恢复工作寄存器并返YI回
优先级
复位
数据异常终止
FIQ
IRQ
预取值异常


三级流水线ARM的组织
①取指级:
②译码级
③执行级
五级流水线ARM的组织
①取指
②译码
③执行
④缓冲\数据    取相关的数据,读缓存或者写缓存
⑤回写          取出后再将数据写回到寄存器中   
在三级流水线下PC的行为
在3级流水线的执行过程中,当通过R15寄存器直接访问PC时,必须考虑到此时流水线的执行过程的真实情况.


ARM存储器接口以及存储器层次
多级存储器使它包括一个容量小但速度快的从存储器和一个容量大但速度慢的主存储器.
这个容量小但速度快的原件是cache,它自动保存处理器经常用到的指令和数据的拷贝.
ARM存储器的接口设计主要包括存储器接口,Cache,MMU(虚拟内存)和保护单元.


ARM指令集编码
ARM指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一第二操作数,目的操作数,条件标志影响位以及每条指令所对应的不同功能实现的二进制位.


每条32位ARM指令都具有不同的二进制编码的方式,和不同的指令功能相对应.
条件执行


ARM指令根据CPSR中的条件位自动判断是否执行指令,在条件满足时,指令执行.
在ARM的指令编码表中,统一占用编码的最高位[31:28]来表示条件.
条件域表 EQ NE  CS   


指令分类以及指令格式
ARM指令集分为6大类
数据处理指令,,load/store指令,跳转指令,程序状态寄存器处理指令,协处理器指令和异常产生指令
ARM指令使用的基本格式
<opcade> {(cond)}{S} <Rd>,<Rn>{,<operand2>}
opcade 操作码,指令助记符LDR,STR
cond 执行条件 EQ
S 根据指令执行结果更新CPSR的条件码
Rn放在第一操作数的寄存器
operand2 第二个操作数


ARM寻址方式


①立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的寻址方式叫做立即寻址.
立即数要求以#为前缀,对于16进制表示的立即数,要求在#后加上0x


②寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作数,是执行效率较高的寻址方式
ADD R0,R1,R2


第二操作数为寄存器型的以为操作
在ARM指令的数据处理指令中参与操作的第二操作数为寄存器型时,在执行寄存器寻址操作时,可以选择是否对第二个操作数进行移位,即Rm
Rm叫做第二操作数寄存器
移位类型
(
LSL,逻辑左移,空出的最低有效位用0填充
LSR,逻辑右移,空出的最高有效位用0填充
ASL,算术左移 和LSL同义
ASR,算术右移,算术移位的对象时带符号数,以为过程中必须保持数的符号不变.符号位 整数0 负数1
ROR循环右移
RRX带扩展的循环右移,将寄存器的内容循环右移1位,空位用原来c标志位填充.
)
在指令执行时将寄存器移位后的内容作为第二操作数参与运算
ADD R3,R2,R1,LSR #2;R3<-R2+R1/4
第二位操作数的移位位数
移位位数可以用立即数方式或者寄存器方式给出 


③寄存器间接寻址:,
寄存器间接寻址就是以寄存器中的值作为操作数的地址,操作数本身存放在存储器中
LDR R0,[R1] 将以R1的值作为地址的存储器中的数据传送到R0中
STR R0,[R1]将R0的值传送到以R1的值为地址存储器中.


④基址加偏址地址
将存储器(该寄存器一般称为基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址.
变址寻址方式常用于访问某基地址附近的地址单元.
采用变址寻址方式的指令又可以分为以下几种形式


前变址模式:
LDR R0,[R1,#4];R0<-[R1+4]
自动变址模式:
LDR R0,[R1,#4]!;R0<-[R1+4],R1<-R4+4
后变址模式:
LDR R0,[R1],#4;R0<-[R1],R1<- R1+4


基址寄存器的地址偏移可以是一个立即数,也可以是另一个寄存器,并且在加到基址寄存器前还可以经过移位操作.
LDR r0,[r1+r2];r0


相对寻址
相对寻址以程序计数器PC的当前值为基地址,指令中的标号作为偏移量,将两者相加之后得到操作数的有效地址.


Load/store指令
ARM的数据存取指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令.ARM指令集中有三种基本的数据存取指令:
①单寄存器的存取指令(LDR,STR)
    
    单寄存器存取指令是ARM在寄存器和存储器件传送单个字节和字的最灵活方式.


②多寄存器存取指令(LDM,STM)
     多寄存器传送指令可以用一条指令将16个可见寄存器的任意子集存储到存储器或从存储器中读取数据到该寄存器集合中.
     与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限    
③单寄存器交换指令(SWP)


程序状态寄存器与通用寄存器之间的传送指令
ARM中有两条指令,用于在状态寄存器和通用寄存器之间传送数据.修改西荒台寄存器一般是通过"读取-修改-写回"三个步骤的操作来实现的.
①状态寄存器到通用寄存器的传送指令(MRS)
②通用寄存器到状态寄存器的传送指令(MSR)


转移指令
ARM的转移指令可以从当前指令向前或向后的32MB的地址空间跳转
根据完成的功能可以分为4种
①B转移指令
B在程序中完成简单的跳转指令,可以跳转到指令指定的目的地址
②BL待链接的转移指令
BL指令完全像转移指令那样执行转移,同时把转移后面紧接的一条指令的地址保存在链接指针寄存器LR(r14)


转移交换和转移链接交换(BX,BLX)
这些指令用于支持thumb(16位)指令集的ARM芯片,程序可以通过这些指令完成从ARM状态到thumb的切换  
③BX带状态切换的转移指令
这些指令
④带链接和状态切换的转移指令


异常中断指令
异常中断指令可以分为两种
①软件中断指令(SWI)
②断电
原创粉丝点击