[嵌入式]Cortex-A8处理器编程(中)

本文详细介绍了Cortex-A8处理器编程中的寻址方式,包括寄存器寻址、立即寻址、寄存器移位寻址、寄存器间接寻址、变址寻址、多寄存器寻址、堆栈寻址和块拷贝寻址。此外,还阐述了Cortex-A8的指令系统,包括32位ARM指令集、Thumb-2指令集、ThumbEE指令集,以及各类数据处理指令、存储器访问指令、分支指令和状态寄存器操作,展示了各种指令的使用示例和工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cortex-A8处理器编程

3.5  寻址方式

寻址方式是根据指令中给出的地址码字段来寻找真实操作数地址的方式。ARM处理器支持的基本寻址方式有以下几种:

(1)寄存器寻址

    所需要的值在寄存器中,指令中地址码给出的是寄器编号,即寄存器的内容为操作数。例如指令:

ADD  R0,R1,R2       ;R0=R1+R2

2) 立即寻址

   立即寻址是一种特殊的寻址方式,指令中在操作码字段后面的地址码部分不是操作数地址,而是操作数本身。例如指令:

SUBS  R0,R0,#1       ;R0ßR0 - 1

MOV  R0,#0xff00       ;R0ß0xff00

(3) 寄存器移位寻址

   寄存器移位寻址方式是ARM指令集中所特有的,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。可以采取的移位操作如下:

  L S L 。逻辑左移,寄存器中字的低端空出的位补0。

  L S R 。逻辑右移,寄存器中字的高端空出的位补0。

  A S R 。算术右移。 算术移位的对象是带符号数。

  R O R 。循环右移,从低端移出的位填入高端空出的位。

  R R X 。带扩展的循环右移,操作数右移一位,空位用原C 标志值填充。

ADD R3,R2,R1,LSL #3        ;R3=R2+8×R1

(4) 寄存器间接寻址

    指令中的地址码给出某一通用寄存器的编号,在被指定的寄存器中存放操作数的有效地址,而操作数则存放在该地址对应的存储单元中,即寄存器为地址指针。例如指令:

LDR R0,[R1]             ;R0=[R1]

SWP R1,R1, [R2]        ;R0与[R1]数值进行交换

(5) 变址寻址

   变址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数有效地址。变址寻址用于访问基址附近的单元,包括基址加偏移和基址加索引寻址。寄存器间接寻址是偏移量为0的基址加偏移寻址。

   基址加偏移寻址中的基址寄存器包含的不是确切的地址。基址需加(或减)最大4KB的偏移来计算访问的地址。例如指令:

LDR R0,[R1,#4]        ;R0=[R1+4]

STR R1,[R0,#-2]        ;[R0-2]ßR1

LDR R0,[R3,R2]        ;R0ß[R3, R2]

(6) 多寄存器寻址

   一次可以传送几个寄存器的值,允许一条指令传送16个寄存器的任何子集。例如指令:

LDMIA R1,{R0,R2,R5} ;R0=[R1],R2=[R1+4],R5=[R1+8]

;由于传送的数据项总是32位的字,基址R1应该字对准。

STMIA R0!,{R3-R6,R10}   ;[R0]=R3,[R0+4]=R4,

 ;[R0+8]=R5,[R0+12]=R6,[R0+16]=R10

(7)堆栈寻址

   堆栈是一种按特定顺序进行存取的存储区,这种特定顺序既是“先进后出”或“后进先出”。堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储器区域。栈指针所指定的存储单元就是堆栈的栈顶。堆栈可分为两种:

向上生长,又称递增堆栈,即地址向高地址方向生长。

向下生长,又称递减堆栈,即地址向低地址方向生长。

满堆栈,堆栈指针指向最后压入堆栈的有效数据项。
空堆栈,堆栈指针指向下一个数据项放入的空位置。

STMFD  SP!,{R1-R7,LR}   ;将R1-R7,LR入栈,满递减堆栈

LDMFD SP!,{R1-R7,LR}  ;数据出栈,放入R1-R7,LR寄存器

(8)块拷贝寻址

    块拷贝寻址指令是一种多寄存器传送指令,多寄存器传送指令用于把一块数据从存储器的某一位置拷贝到另一位置。块拷贝指令的寻址操作取决于数据是存储在基址寄存器所指的地址之上还是之下、地址是递增还是递减,并与数据的存取操作有关。

 

STMIA R0!,{R1-R7} 

STMIB R0!,{R1-R7} 

LDMFB R0!,{R1-R7} 

LDMFA R0!,{R1-R7} 

(9)相对寻址

    相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址,指令中的地址码字段作为偏移量,两者相加后得到操作数的有效地址。偏移量指出的是操作数与当前指令之间的相对位置。子程序调用指令即是相对寻址指令。

目标地址 = pc 当前值 + 指令给出的标号偏移地址

 BL SUB1

           BEQ LOOP

             。。。

            LOOP   MOV R6,#1

SUB1    。。。

3.6  指令系统

Cortex-A8采用ARMv7架构,包含:

·32位的ARM指令集

·16位和32位混合的Thumb-2指令集

·ThumbEE指令集

主要内容包括:

1.指令格式

2.条件码

3.存储器访问指令

4.数据处理指令

5.乘法指令

6.ARM分支指令

7.协处理器指令

8.杂项指令

9.伪指令

一、ARM指令集——指令格式

·ARM指令的基本格式如下:

<opcode> {<cond>} {S}    <Rd> ,<Rn>{,<operand2>}

其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下:

opcode:指令助记符;cond:执行条件;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值