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

 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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值