Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188608
  • 博文数量: 40
  • 博客积分: 1031
  • 博客等级: 少尉
  • 技术积分: 321
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-18 11:35
文章分类
文章存档

2022年(1)

2020年(1)

2017年(1)

2016年(5)

2015年(1)

2013年(1)

2011年(13)

2010年(16)

2009年(1)

我的朋友

分类: LINUX

2010-08-30 17:27:05

ARM 处理器寻址方式
寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有 9 种基本寻址方式。

1、寄存器寻址
MOV R1,R2    ;R2 -> R1
SUB R0,R1,R2 ;R1 - R2 -> R0

指令执行时直接取出寄存器值操作。

2、立即寻址
SUBS R0,R0,#1 ;R0 – 1 -> R0
MOV R0,#0xff00 ;0xff00 -> R0

数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数。
立即数要以“#”为前缀,表示 16 进制数值时以“0x”表示。

3、寄存器偏移寻址
MOV R0,R2,LSL #3    ;R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8
ANDS R1,R1,R2,LSL R3 ;R2 的值左移 R3 位,然后和 R1 相与操作, 结果放入 R1

寄存器偏移寻址是 ARM 指令集特有的寻址方式,当第 2 操作数是寄存器偏移方式时,第 2 个寄存器操作数在与第 1 个操作数结合之前,选择进行移位操作。

可采用的移位操作如下:
LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补 0
LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补 0
ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的高端空出的位补 0,否则补 1
ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位
RRX:带扩展的循环右移(Rotate Right eXtended by 1place),操作数右移一位,高端空出的位用原 C 标志值填充。

4、寄存器间接寻址
LDR R1,[R2]   ;将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中
SWP R1,R1,[R2];将如R2中的数值作为地址,取出此地址中的数值与 R1 中的值交换

指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。

5、基址寻址
LDR R2,[R3,#0x0F] ;将 R3 中的数值加 0x0F 作为地址,取出此地址的数值保存在 R2 中
STR R1,[R0,#-2] ;将 R0 中的数值减 2 作为地址,把 R1 中的内容保存到此地址位置

基址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄 存器访问等。

6、多寄存器寻址
LDMIA R1!,{R2-R7,R12} ; 将 R1 单元中的数据读出到 R2-R7,R12,R1 自动加 1
STMIA R0!,{R3-R6,R10};将 R3-R6,R10 中的数据保存到 R0 指向的地址,R0 自动加 1

多寄存器寻址就是一次可以传送几个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有寄存器。
使用多寄存器寻址指令时,寄存器子集的顺序时由小到大的顺序排列,连续的寄存器可用“-”连接,否则,用“,”分隔书写。

7、堆栈寻址
STMFD SP!,{R1-R7,LR} ; 将 R1~R7,LR 入栈。满递减堆栈。
LDMFD SP!,{R1-R7,LR} ;数据出栈,放入 R1~R7,LR 寄存器。满递减堆栈。

堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出” ,堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元就是堆栈的栈顶。
存储器堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要放入的空位置, 称为空堆栈。这样就有 4 中类型的堆栈表示递增和递减的满堆栈和空堆栈的各种组合。
满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如 LDMFA,STMFA 等。
空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空位置。指令如 LDMEA,STMEA 等
满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最低地址。指令如 LDMFD,STMFD 等。
空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空位置。指令如 LDMED,STMED 等。

8、块拷贝寻址
STMIA R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之后增加,增长方向为向上增长。
STMIB R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之前增加,增长方向为向上增长。
STMDA R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之后增加,增长方向为向下增长。
STMDB R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之前增加,增长方向为向下增长。

多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置。块拷贝寻址指令举例如下:
9、相对寻址
BL   ROUTE1    ;调用到 ROUTE1 子程序
BEQ LOOP      ;条件跳转到 LOOP 标号处

LOOP MOV R2,#2

ROUTE1

相对寻址是基址寻址的一种变通,由程序计数器 PC 提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。

阅读(1192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~