arm学习笔记二(arm寻址方式)
2024-10-17 来源:cnblogs
工作状态
arm状态 32位指令
thumb状态 16位指令
存储器的格式
最大寻址空间为4gb
大端格式:字数据的高字节存储在低地址中,低字节存放在高地址中
小端格式:与大端格式相反
axd查看寄存器
=================================================================
arm寻址方式(貌似计算机原理中学过)
处理器根据指令中给出的地址信息来寻找物理地址的方式
立即寻址
立即数寻址
示例代码如下:
add r0,r0,#1; r0<--r0+1
add r0,r0,#0x3f; r0<--r0+0x3f 以十六进制表示的立即数要加0x或&
寄存器寻址
利用寄存器中的数值作为操作数
示例代码如下:(将r1和r2中的内容相加,结果存放在寄存器r0中)
add r0,r1,r2; r0<--r1+r2
寄存器间接寻址
以寄存器中的值作为操作数的地址,操作数存放在存储器中
示例代码如下:
add r0,r1,[r2]; r0<--r1+[r2]
ldr r0,[r1]; r0<--[r1]
基址变址寻址
将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址
示例代码如下:
ldr r0,[r1,#4]; r0<--[r1+4]
ldr r0,[r1,#4]!; r0<--[r1+4],r1<--r1+4
ldr r0,[r1],#4; r0<--[r1],r1<--r1+4
ldr r0,[r1,r2]; r0<--[r1+r2]
多寄存器寻址
一条指令可以完成多个寄存器值的传送,最多16个通用寄存器
示例代码如下:
ldmia r0,{r1,r2,r3,r4}; r1<--[r0]
; r2<--[r0+4]
; r3<--[r0+8]
; r4<--[r0+12]
ia表示每次在执行完加载、存储操作后,r0按字长度增加,可将连续存储单元的值
传送到r1-r4
相对寻址
以程序计数器pc的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数的有效地址
示例代码如下:
bl next; 跳转到子程序next的执行处
next
mov pc,lr; 从子程序返回
堆栈寻址
按先进先出的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置
递增堆栈
递减堆栈
满堆栈
空堆栈