
ARM LoadStore架构
LoadStore架构
存储器之间不能直接拷贝,必须通过寄存器做中转:在 ARM 架构中,数据传输只能通过寄存器和存储器之间的操作完成,不能直接在存储器之间进行拷贝。
Load 指令
load指令 | 描述 |
---|---|
ldr r0, [r7] |
从地址 r7 指向的存储器中读取 4 字节的数据到寄存器 r0。 |
ldrb r0, [r7] |
从地址 r7 指向的存储器中读取 1 字节的数据到寄存器 r0。 |
ldrh r0, [r7] |
从地址 r7 指向的存储器中读取 2 字节的数据到寄存器 r0。 |
ldr r0, [r7, #8] |
从 r7 地址加 8 的存储器空间中读取 4 字节的数据到寄存器 r0。 |
ldr pc, _irq |
将 _irq 地址(标签)中的内容载入 pc(程序计数器)。 |
Store 指令
Store 指令 | 描述 |
---|---|
str r0, [r8] |
将寄存器 r0 的值存储到 r8 地址指向的存储器空间中。 |
str r0, [r8, #4] |
将寄存器 r0 的值存储到 r8 地址加 4 的存储器空间中,并且 r8 自增 4。 |
str r0, [r8, #4] |
(错误,应该是 str r0, [r8], #4 ):将寄存器 r0 的值存储到 r8 地址加 4 的存储器空间中。 |
下面是要用到的一些伪指令
伪指令 | 描述 |
---|---|
.data |
定义数据段。 |
.byte |
在数据段中分配并初始化一个或多个字节的数据。 |
.space |
在数据段中分配一定数量的字节,但不进行初始化。 这通常用于保留内存空间,稍后可以在程序中使用。 |
简单示例
.text
b main
nop
nop
nop
nop
nop
nop
nop
main:
ldr r7,=srcBuf
ldr r8,=destBuf
ldr r0,[r7]
str r0,[r8]
main_end:
b main_end
.data
srcBuf:
.byte 0x00,0x01,0x02,0x03
destBuf:
.space 16
.end
r7
获取到的地址,我们可以通过内存memory1
窗口来看数据的具体位置。
在右下角。
r8
获取到的地址0x00000218
占16位的空数据。
再执行如下两行将r7
的内容赋值到内存中0x00000218
里面了。
前索引和后索引
前索引模式在内存访问之前对基地址寄存器进行偏移计算。指令格式如下:
[base, #offset]
先将 base 和 offset 相加,然后访问计算后的地址。
.text
b main
nop
nop
nop
nop
nop
nop
nop
main:
ldr r7,=buf
mov r0,#0xAB
str r0,[r7,#8]
main_end:
b main_end
.data
buf:
.byte 0x00,0x01,0x02,0x03
.byte 0x04,0x05,0x06,0x07
.byte 0x08,0x09,0x0A,0x0B
.end
后索引模式在内存访问之后对基地址寄存器进行偏移计算。
str r0, [r7], #8 // 将 r0 的值存储到 r7 地址处,然后 r7 = r7 + 8
.text
b main
nop
nop
nop
nop
nop
nop
nop
main:
ldr r7,=buf
mov r0,#0xAB
str r0,[r7,#8]
str r0,[r7],#8
main_end:
b main_end
.data
buf:
.byte 0x00,0x01,0x02,0x03
.byte 0x04,0x05,0x06,0x07
.byte 0x08,0x09,0x0A,0x0B
.end
可以看到寄存器R7的地址更新了。
load_store 实现数据拷贝
通过下面的c语言代码实现相关汇编。
main(){
int i = 0;
const char buf[]=[1,2,3];
char destBuf[8];
for(i=0;i<3;i++){
destBuf[i]=buf[i]
}
}
.text
b main
nop
nop
nop
nop
nop
nop
nop
main:
mov r0,#0
ldr r7,=buf
ldr r8,=destBuf
b loop_func1
main_end:
b main_end
loop_func1:
cmp r0,#3
beq main_end
ldrb r4,[r7],#1
strb r4,[r8],#1
add r0,#1
b loop_func1
loop_func1_end:
mov pc,lr
.data
buf:
.byte 1,2,3
destBuf:
.space 8
.end
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术