【愚公系列】2022年06月 ARM汇编 LDR和STR

举报
愚公搬代码 发表于 2022/06/30 20:49:23 2022/06/30
【摘要】 学习内存指令,加载和存储ARM使用载入-存储模型来访问内存,意味着只有加载/存储(LDR和STR)指令才可以访问内存。在X86中,大多数指令允许直接操作内存中的数据,而在ARM中,在操作数据之前,必须把数据从内存移动到寄存器中。这意味着在ARM下,若要增加特定内存地址里的32位的数值,将需要用到三种类型的指令(载入、增加和存储):首先将特定地址里的数值加载到寄存器中,然后在寄存器中增加它,...

学习内存指令,加载和存储

ARM使用载入-存储模型来访问内存,意味着只有加载/存储(LDR和STR)指令才可以访问内存。在X86中,大多数指令允许直接操作内存中的数据,而在ARM中,在操作数据之前,必须把数据从内存移动到寄存器中。这意味着在ARM下,若要增加特定内存地址里的32位的数值,将需要用到三种类型的指令(载入、增加和存储):首先将特定地址里的数值加载到寄存器中,然后在寄存器中增加它,最后将数据从寄存器返存回内存里。

  1. 先来看LDR,STR。

通常,LDR用于将内存数据加载到寄存器中,STR用于从寄存器的值存储到内存地址对应的内存中。如下图所示
在这里插入图片描述
格式如下:

LDR R2, [R0] @ [R0] - 原始地址是R0里的数值

STR R2, [R1] @[R1] - 目标地址是R1里的数值

LDR操作:将在R0中找到的地址的值加载到目标寄存器R2。

STR操作:将R2中找到的值存储在R1中找到的内存地址中。

我们先来看第一种偏移形式:立即数用作偏移。这里我们使用一个立即数(整数)作为偏移量。这个值通过与基址寄存器(下面的例子中的R1)相加或相减来访问数据。

示例代码如下,在test2.s中

在其中已经写好注释了
在这里插入图片描述
中文注释为:

_start:

ldr r0, adr_var1  将变量var1的内存地址通过标签adr_var1载入R0

ldr r1, adr_var2  将变量var2的内存地址通过标签adr_var2载入R1

ldr r2, [r0]      @ 将r0里的值作为地址取出里面的值(0x03)存入寄存器R2 

str r2, [r1, #2]     寻址模式:偏移模式。将存储在R2里的值(0x03)存放在以r1+2为地址指向的内存空间中。基址寄存器(R1)的值不变

str r2, [r1, #4]!    寻址模式:先索引模式。将存储在R2里的值(0x03)存放在以r1+4为地址指向的内存空间中,然后基址寄存器(R1)被修改为R1=R1+4

ldr r3, [r1], #4    寻址模式:后索引模式。将存储在R1里的值作为内存地址取出里面的值存放在以r3中(而非R3+4),然后基址寄存器(R1)被修改为R1=R1+4

bkpt                  中断,暂停程序

寄存器的值用作偏移:

ldr r0, adr_var1  透过adr_var1标签,将var1变量的内存地址加载进R0

ldr r1, adr_var2  透过adr_var2标签,将var2变量的内存地址加载进R1

ldr r2, [r0]    将R0里的值作为内存地址,把地址里的数值(0x03)载入r2

str r2, [r1, r2]     寻址模式:偏移寻址。将R2里的值存入:R1+R2(0x03,偏移)的结果所指向的内存空间中。基址寄存器不更新。

str r2, [r1, r2]!    寻址模式:先索引模式。将R2的值(0x03)存入:R1+R2(0x03,用作偏移)得出的结果所指向的内存空间中。基址寄存器R1更新为R1 = R1+R2。

ldr r3, [r1], r2  寻址模式:后索引模式。将R2的值作为地址取出里面的值,并将其存入寄存器R3。基址寄存器R1更新为R1=R1+R2。

移位寄存器作为偏移。

_start:

ldr r0, adr_var1      透过adr_var1标签,将var1变量的内存地址加载进R0

ldr r1, adr_var2      透过adr_var2标签,将var2变量的内存地址加载进R1

ldr r2, [r0]              将R0里的值作为内存地址,把里面的值(0x03)载入r2

str r2, [r1, r2, LSL#2]   寻址模式:偏移寻址。将R2里的值(0x03)存入:R1的值+偏移量(R2左移2位后的值)的结果所指向的内存空间中。基址寄存器(R1)不更新。

str r2, [r1, r2, LSL#2]!  寻址模式:先索引寻址。将R2里的值(0x03)存入:R1的值+偏移量(R2左移2位后的值)的结果所指向的内存空间中。基址寄存器(R1)更新为R1 = R1 + R2<<2。

ldr r3, [r1], r2, LSL#2   寻址模式:后索引寻址。将R1的值作为地址取出里面的值,并将其存入寄存器R3。基址寄存器R1更新为R1=R1+R2<<2。

bkpt
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。