ARM汇编

1 add指令

ADD{条件}{S}  <dest>, <op 1>, <op 2>
                dest = op_1 + op_2

ADD 将把两个操作数加起来,把结果放置到目的寄存器中。

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

2 LDM与STM

ARM指令中多数据传输共有两种:

LDM:(load much)多数据加载,将地址上的值加载到寄存器上

STM:(store much)多数据存储,将寄存器的值存到地址上

2.1 格式

格式:

LDM{cond}  mode  Rn{!}, reglist{^}

STM{cond}  mode  Rn{!}, reglist{^}

其中

 Rn:基址寄存器,装有传送数据的起始地址,Rn不允许为R15;

 !:表示最后的地址写回到Rn中;

 reglist:可包含多于一个寄存器范围,用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大顺序排列;

 ^:不允许在用户模式和系统模式下运行

2.2 模式

主要用途:现场保护、数据复制、参数传送等,共有8种模式(前面4种用于数据块的传输,后面4种是堆栈操作)如下:

(1)IA:(Increase After) 每次传送后地址加4,其中的寄存器从左到右执行,例如:STMIA R0,{R1,LR} 先存R1,再存LR

(2)IB:(Increase Before)每次传送前地址加4,同上

(3)DA:(Decrease After)每次传送后地址减4,其中的寄存器从右到左执行,例如:STMDA R0,{R1,LR} 先存LR,再存R1

(4)DB:(Decrease Before)每次传送前地址减4,同上

(5)FD: 满递减堆栈 (每次传送前地址减4)

(6)FA: 满递增堆栈 (每次传送后地址减4)

(7)ED: 空递减堆栈 (每次传送前地址加4)

(8)EA: 空递增堆栈 (每次传送后地址加4)

注意:其中在数据块的传输中是STMMDB和LDMIA对应,STMMIA和LDMDB对应

而在堆栈操作是STMFD和LDMFD对应,STMFA和LDMFA对应

2.3 例子

例子1:将地址上的值加载到寄存器上,同时更新寄存器。

Ldr R1,=0x10000000          //传送数据的起始地址0x10000000     
LDMIB R1!,{R0,R4-R6}      //从左到右加载,相当于 LDR R0,10000004  LDR R4,10000008... ...
/*传送前地址加+4,
所以地址加4,R0=0X1000004地址里的内容,
地址加4,R4=0X10000008地址里的内容,
地址加4,R5=0X1000000C地址里的内容,
地址加4,R6=0X10000010 地址里的内容,
由于!, 最后的地址写回到R1中,R1=0X10000010   */

例子2:将地址上的值加载到寄存器上,不更新寄存器。

LDR R1,=0x10000000          //传送数据的起始地址0x10000000        
LDR R4,=0X10
LDR R5,=0X20
LDR R6,=0X30
STMIB R1,{R4-R6}          //从左到右加载,相当于STR [R4],0X10000004    STR [R5],0X10000008 .....
/*传送前地址加+4,所以0X10000004地址=0X10,0X10000008地址=0X20,0X1000000C地址=0X30 */

例子3: 将寄存器的值加载到对应的地址,不更新寄存器。

LDR R1,=0x10000000          //传送数据的起始地址0x10000000        
LDR R4,=0X10
LDR R5,=0X20
LDR R6,=0X30
STMIB R1,{R4-R6}          //从左到右加载,相当于STR [R4],0X10000004    STR [R5],0X10000008 .....
/*传送前地址加+4,所以0X10000004地址=0X10,0X10000008地址=0X20,0X1000000C地址=0X30 */

例子4: 将寄存器的值加载到对应的地址,更新寄存器。

Ldr R1,=0x10000000        //传送数据的起始地址0x10000000  
LDR R4,=0X10
LDR R5,=0X20
LDR R6,=0X30           
STMIA R1!,{R4-R6 }     
/*传送后地址加+4,所以0X10000000地址=0X10,0X10000004地址=0X20,0X10000008地址=0X30,由于!,最后的地址写回到R1中,所以R1=0X1000000C  */

注:寄存器Rn随着条件IA增加或者减,同时把最后的值更新到Rn中。

3. STR指令

格式:

STR{条件}  源寄存器,<存储器地址>

STR指令用于从源寄存器中将一个32位的字数据传送到存储器中
例子:

STR R0,[R1],#8             ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1
STR R0,[R1,#8]             ;将R0中的字数据写入以R1+8为地址的存储器中。
str     r1, [r0]                       ;将r1寄存器的值,传送到地址值为r0的(存储器)内存中

4.msr和

4.1 MRS

格式:

MRS{条件}     通用寄存器,程序状态寄存器(CPSR戒SPSR)

作用:

MRS指令用亍将程序状态寄存器的内容传送到通用寄存器中。

使用场景:

Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,
修改后再写回程序状态寄存器。
Ⅱ.当在异常处理进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄
存器的值,然后保存。

使用例子:

指令示例:
MRS R0,CPSR                          ;传送CPSR的内容到R0
MRS R0,SPSR                          ;传送SPSR的内容到R0”

5.2 MSR

格式:

MSR{条件}     程序状态寄存器(CPSR戒SPSR)_<域>,操作数

作用:

MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄
存器或立即数。

参数说明:

<域>用亍设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
位[31:24]为条件标志位域,用f表示;
位[23:16]为状态位域,用s表示;
位[15:8]为扩展位域,用x表示;
位[7:0]为控制位域,用c表示;

例子:

MSR CPSR,R0         ;传送R0的内容到CPSR
MSR SPSR,R0         ;传送R0的内容到SPSR
MSR CPSR_c,R0       ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

参考

添加链接描述

https://www.cnblogs.com/lifexy/p/7363208.html
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值