arm第十天(汇编指令下)

加载、存储指令
加载指令:将数据从存储器中读取到寄存器
存储指令:将处理完毕后的数据存储到存储器

这类指令实现了寄存器和存储器(内存)之间的数据交互
数据:
字和无符号字节
半字和有符号字节

单寄存器
多寄存器

单寄存器的加载指令:

  • 单寄存器的加载指令
    LDR{cond} Rd,<地址模式>
    功能:将指定地址单元中字(4个字节)数据读到Rd中; 4字节 = 32 byte
    从内存中读取一个字数据到寄存器中
  • 单寄存器无符号的加载指令
    LDR{cond}-B Rd,<地址模式>
    功能:将指定地址单元中一个字节数据读到Rd中,
    读过来的数据放到寄存器的低8bit,高24bit填充0; 寄存器32bit,一个字节8bit

这里写图片描述

1,零偏移
LDR{cond} Rd,<地址模式>
LDR R0,[R1]
这里写图片描述
R1 = 0x20008000
R0 = 0xe92d4800
2, [,#+/-] 偏移量为立即数
LDR R0,[R1,#0x8] ;R0 <-[R1+0x80]
R1 = 0x20008000 [R1+0x80] = 0x20008000
R0 = 0xe59f3060

LDR Ro,[[R1,#-0x20]  ;R0 <-[R1+0x80]

3,[,+/-] 偏移量为寄存器
LDR R0,[R1,R2] ;R0 <- [R1+R2]
LDR R0,[R1,-R2] ;R0 <- [R1-R2]

4,[Rn,+/-, #]
LDR R0,[R1,R2,LSS #2] ;R0 <- [R1+(R2<<2)]

5, [Rn,#+/-]!
LDR R0,[R1,#0x8]! ;R0 <-[R1+0x80] R1 = R1+8 注意基础R1也发生了变化

这里写图片描述

6,[,+/- ]!
LDR R0,[R1,R2]! ;R0 <- [R1+R2] R1 = R1+R2

地址模式:
10种:基址+偏移量(立即数、寄存器、寄存器移位)

  1. 无偏移 将指定基址中的数据加载到寄存器中,基址不变
    LDR R0,[R1]

  2. 将基址+偏移量中的数据加载到寄存器中,基础不变
    LDR R0,[R1,#0x8]
    1,立即数
    2,寄存器
    3,寄存器移位

  3. 将基址+偏移量中数据加载到寄存器,基址=基址+偏移量
    LDR R0,[R1,#0x8]
    1,立即数
    2,寄存器
    3,寄存器移位
  4. 将基址中数据加载到寄存器中,基址 = 基址+偏移量
    LDR R0,[R1],#0x8
    1,立即数
    2,寄存器
    3,寄存器移位

存储指令:
格式:
STR {cond} Rd, <地址模式>
功能:将Rd寄存器中的字数据保存到指定的存储单元
STR {cond}B Rd, <地址模式>

这里写图片描述

 LDR R1,[R2] //把R2里面的值加载到R1
 LDR PC,[R0,#8] //R0+8 加载到PC里面,修改了PC,程序会发生跳转
 LDRB R1,[R2] #1   //先把R2中的数据加载到R1低8bit,然后地址自增1
 LDR R1,[PC,R3] //R3+PC的值,加载到R1
 LDR R1,[R2,R3,LSL #2] //
 LDREQB R1,[PC,R3]//在EQ下,R3+PC的值,加载到R1的低八位
STR R1,[R2] 
STR R1,[R2],#1
STR R1,[R2R3]
STRB R0,[R1,R2,ASR #2] //  ASR算术右移
STREQB  R0,[R1,R2,ASR #2] //在EQ条件下
STR PC,[R2#8]

字和无符号字节
半字和有符号字节
LDR{cond}SB Rd,<地址模式>
功能:从指定地址读取一个字节到Rd的低8bit,高24bit用符号位填充
LDR{cond}SH Rd,<地址模式>
功能:从指定地址读取有符号的半字到Rd的低16bit,高16bit用符号位填充
LDR{cond}H Rd,<地址模式>
功能:从指定地址读取无符号半字到Rd的低16bit,高16bit 用0填充
STR{cond}H Rd,<地址模式>
功能:从Rd寄存器中半字存到指定地址

这里写图片描述

这里写图片描述

内存块拷贝

这里写图片描述

拷贝案例:

loop: 
    ldr r0,[r8],#4 //r8的地址读到r0,地址自增(4个字节)
    str r0,[r10],#4 //把读出来的数据存到r10,地址挪一下,方便下次读
    cmp r8,r9 
    blt loop //bl + t,相当于条件

ARM栈
这里写图片描述

满减栈
入栈:栈顶指针是减小
出栈:栈顶指针是增加
满栈:栈顶指针指向的真正有效数据

这里写图片描述

栈操作指令
入栈 ,将r4,r5,r6,r7,lr入栈
STMFD sp! ,{r4-r7,lr} //sp(r13)存放栈顶指令.将r4,r5,r6,r7,lr入栈 。r4-r7表示连续的r4,r5,r6,r7
PUSH {r4-r7,lr} //如果是连续的,只需要写头尾即可

根据满栈减栈规则,栈顶指针向地址减小的方向变化,栈顶元素是真正的有效元素,大编号的寄存器在高地址,小编号寄存器存放在低地址,依次入栈。

出栈:将栈中的元素依次出栈到r4,r5,r6,r7,pc
LDMFD sp!,{r4-r7,pc} //将栈中的元素依次出栈到r4,r5,r6,r7,pc

根据满栈减栈规则,栈顶指针向地址减小的方向变化,栈顶元素是真正的有效元素,低地址的数据出栈给小编号寄存器,高地址的数据出给大编号的寄存器,依次出栈。

这里写图片描述

状态寄存器访问指令
CPSR
SPSR

MRS程序状态寄存器读指令
MRS指令语法格式:
MRS{} ,psr
cond:条件吗
Rd:目标寄存器
Psr 程序状态寄存器
MRS{} ,CPSR
MRS{} ,SPSR

MRS R0,CPSR //将CPSR状态寄存器读取,保存到R0中
MRS R0,SPSR //将SPSR状态寄存器读取,保存到R0中

这里写图片描述

域可以为以下字母(必须小写)的一个或者组合
c 控制域屏蔽字节(psr[7..0])
x扩展域屏蔽字节(psr[15..8])
s状态域屏蔽字节(psr[23..16])
x标志域屏蔽字节(psr[31..24])

这里写图片描述

41

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值