您的位置:首页 > 其它

ARM学习笔记(1)---关于寄存器的说明

2008-03-30 23:31 218 查看
1.ARM7三级流水线,分别是取指,译码,执行,ARM9的为五级流线结构多了存储和写回,ARM10为六级,ARM11为八级流水线结构.
2.ARM状态与Thumb状态下的寄存器组织关系是:
Thumb状态下和ARM状态下的R0~R7是相同的;
Thumb状态下和ARM状态下的CPSR(Current Program Status Register当前程序状态寄存器)跟所有的SPSR(Saved Program Status Register备份程序状态寄存器)是相同的;
Thumb状态下的SP对应于ARM状态下的R13;
Thumb状态下的LR对应于ARM状态下的R14;
3.由于ARM体系结构采用了多级流水线技术,对于ARM7指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节.
4.当异常发生时SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR:用户模式,系统模式与异常模式不同,不需要保留当前的状态,没有SPSR,在这两种模式下不能访问SPSR.
5.ARM存储格式有两种格式的字数据,即大端格式和小端格式,其定义如下:
小端格式(little endian):在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节
大端格式(big endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中.
缺省状态下为小端格式.
6.AMBA接口(Advanced Microcontroller Bus Architecture)
分三种AHB,APB,ASB
AHB(Advanced High-performanced Bus)用于连接高性能模块的接口总线,支持单个数据传送和猝发方式的数据传送;
APB(Advanced Peripheral Bus)用于连接高性能模块的接口总路线,支持猝发方式的数据传送;
ASB(Advanced System Bus)用于连接低性能模块的接口总线;
7.ARM的寻址方式9种:
(1)立即寻址:操作数由指令的地址部分直接给出
ADD R4,R3,#1; r4=r3+1
(2)寄存器寻址:操作数是通用寄存器中的数值
ADD R0,R1,R2; r0=r1+r2;
(3)间接寻址:寄存器中的值是操作数的地址
ADD R0,[R1]; r0=[r1]
(4)基址寻址:将指令中给出的基址寄存器内容与指令中给出的偏称量disp相加,其结果作为有效地址,从存储器中读出操作数,这种寻址方式称为基址寻址.在ARM指令系统中,偏称量disp不得超过4KB,ARM的基址寻址包括前索引寻址和后索引寻址.前索引是将基址与偏移量相加作为传送数据的地址,如在寻址中使用!,传送数据后自动将数据的地址传送给基址寄存器,否则不修改基址寄存器.
LDR R0,[R1,#4] ;R0<-[R1+4]
LDR R0,[R1,#4]! ;R0<-[R1+4],R1<-R1+4
(5)相对寻址:PC的内容与指令中的地址码部分给出的位移量disp之和作为操作数的有效地址,这种寻址称为相对寻址.它是基址寻址的一种变通.
BL SUBR1 ;转换到SUBR1
...

SUBR1
...
MOV PC, R14 ;返回
(6)移位寻址:移位寻址是ARM指令集特有的,ARM微处理器内核含有桶型称位器(Barrel shifter),移位寻址方式包括寄存器型移位寻址和立即数型移位寻址.
在ARM指令集中,相当一部分指令是三操作数,即结果寄存器,第一操作数寄存器,第二操作数寄存器.
如果第二操作数或者单一数据传送指令中操作数是寄存器类型,可以对其进行各种移位操作,形成操作数,然后与第一个操作数运算,称为寄存器型移位寻址,如:
ADD R3, R2, R1, LSL #4 ;R3=R2+16*R1
如果数据处理指令中第二个操作数是立即数(在指令中最多使用8位立即值),对超过表示范围的立即数,即对大于255的立即数,可以通过立即数的移位来表示,称为立即数移位
ADD R3, R2, #8, LSL R4; R3=R2+8的R4次方
当立即值在O-0XFF之间时候,令immed_8=<immediate>,rotate_imm=0;汇编器需要通过在指令中设置循环移位数量来表示立即数,如果不能表示则生成一个错误.
(7)多寄存器寻址:一次向几个寄存器传送的值,允许一条指令向16个寄存器的任何子集(或所有的16个寄存器)传送数据,如:
LDMIA R1,{R0,R2,R5} ;R0=[R1]
;R2=[R1+4]
;R5=[R1+8]
寄存器的编号连续时,如R2,R3,R4,R5,可以用R2-R5表示.不连续的用,分隔,要求书写的寄存器编号顺序为由小到大.
(8)堆栈寻址:使用一个称为堆栈指针的专用寄存器指示当前操作位置,堆栈指针总是指向栈顶.它一般使用寄存器R12作为SP寄存器)指向一块存储区域(堆栈).堆栈指针所指定的存储单元不是堆栈的栈顶,存储器堆栈可分为两种:
1.向上生长:即向高地址方向生长,称为递增堆栈.
2.向下生长:即向低地址方向生长,称为递减堆栈.
满堆栈是指堆栈指针指向最后压入堆栈的有效数据项.空堆栈是指堆栈指针指向下一个数据项放入的空位置,使用堆栈操作有四个,分别为:
FD表示满递减堆栈
ED表示空递减堆栈
FA表示满递增堆栈
EA表示空递增堆栈
堆栈寻址是一种按特定顺序进行存取的存储区访问,访问顺序可归结为"后进先出"
STMFD SP! {R1,R3-R7,LR} ;将寄存器的数据保存到堆栈,存储器 ;指针在保存后自动增加
LDMFD SP!,{R1,R3-R7,LR} ;将堆栈的数据恢复到寄存器
(9)块拷贝寻址:将寄存器内容复制到基址寄存器的地址所指示的存储器中.需要注意的是在存储第一个值之后存储器地址是增加还是减少.增值类型可选IA,IB,DA,DB四项之一,其含义为:
IA---每次传送后,地址加4
IB---每次传送前,地址加4
DA---每次传送后,地址减4
DB---每次传送前,地址减4

STMIA R0!, {R1,R3-R7,LR};将寄存器的数据分别保存到存储器
;存储器指针在保存后自动增加
;增加方向为向上增加1
STMIB R0!,{R1,R3-R7,LR} ;将寄存器的数据分别保存到存储器
;存储器指针在保存前自动增加
;增加方向为向上增加1
STMDA R0!,{R1,R3-R7,LR} ;将寄存器的数据分别保存到存储器
;存储器指针在保存后自动增加
;增加方向为向下增加4
STMDB R0!,{R1,R3-R7,LR} ;将寄存器的数据分别保存到存储器
;存储器指针在保存第一个值之前自动增加
;增加方向为向下增加4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: