ARM处理器寻址

ARM处理器的运行模式

用户模式

可以使用的不分组寄存器R0~R7,分组寄存器R8~R14.程序计数器R15(PC),

工作状态

ARM状态和Thumb状态,处理器可以在这两种状态之间随意切换。
当处理器处于ARM状态的时候,执行32位字对齐的ARM指令
当处理器处于Thumb状态的时候,会执行16位对齐的Thumb指令
ARM状态和Thumb状态的寄存器命名差异
Thumb状态下R0~R7和ARM状态下的R0和R7相同
Thumb状态下CPSR和ARM状态下的CPSR相同
Thumb状态下的FP对应ARM状态下的R11
Thumb状态下的IP对应于ARM状态下的R12
Thumb状态下的SP对应于ARM状态下的R13
Thumb状态下的LR对应于ARM状态下的R14
Thumb状态下的PC对应于ARM状态下的R15

立即寻址

实例:

MOV R0,#1234

执行结果:

R0=1234
立即数以#开头

寄存器寻址

格式

MOV R0,R1

执行结果

R0=R1

寄存器移位寻址

基本操作

LSL:逻辑左移,移位后的寄存器空出的低位补0
LSR:逻辑右移,移位后的寄存器空出的高位补0
ASR:算术右移,移位过程中符号位保存不变,如果源操作数是正数则移位后空出的高位补0,否则补1。
ROR:循环右移,移位后移出的低位填入移位空出的高位。
RRX:带拓展的循环右移,操作数右移一位,移位空出的高位有C标志位的值填充。

实例:

MOV R0,R1,LSL #2

执行结果:

R1的值逻辑左移两位,R1<<2
R0=R1*4

寄存器间接寻址

实例:

LDR R0,[R1]

执行结果:

将R1保存的是数值的地址,取出地址里的值并且将其赋给R0

基址寻址

实例:

LDR R0,[R1,#-4]

执行结果:

将R1保存的是数值的地址,将地址的值减4的到新地址,取出新地址里的值并且将其赋给R0

多寄存器寻址

LDMIA R0,{R1,R2,R3,R4}
LDM是数据加载指令,指令的后缀IA表示每次执行完加载操作之后R0寄存器的值自增1个字,ARM指令集中,字表示一个32位的数值。这条指令执行后:
R1=[R0],R2=[R0+#4],R3=[R0+#8],R4=[R0+#12]

堆栈寻址

堆栈寻址是ARM的一种特有的寻址方式,指令对
(LDMFA/STMFA;LDMEA/STMEA;LDMFD/STMFD;LDMED/STMED)
前缀:LDM和STM,表示多寄存器寻址
后缀:FA,EA,FD,ED

块拷贝寻址

指令对:
(LDMIA/STMIA;LDMDA/STMDA;LDMIB/STMIB;LDMDB/STMDB)

相对寻址

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

NEXT:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值