ARMSim中的STR / LDR到内存#

时间:2015-09-13 04:15:22

标签: assembly arm

我有一个介绍性的任务是使用ARMSim#(最多10行)制作一个小程序,以便习惯基本命令。

所以我试着这样做:

MOV r1, #4
MOV r2, #15
STR r2, [r1]
LDR r3, [r1]
SWI 0x11

该程序应该将直接值“4”分配给r1寄存器,而不是将直接值“15”分配给r2寄存器。之后,它应该将r2内容存储在我的内存的“地址4”中(我知道内存地址必须是4的倍数)最后,r3应该从“地址4”内存中获取内容,但它得到的全部是0。

它出了什么问题?我尝试查找其他网站,但他们的语法与我的相同,但我仍然无法使用LDRSTR将r2内容放入r3。我知道我可以使用MOV来做到这一点,但我的目的是学习一些新的指示。

3 个答案:

答案 0 :(得分:0)

我正在使用ARMSim#Version 1.9.1(20500)进行测试。

在MemoryView中,地址0x00000004的值是????????地址0x00002004的一个是81818181.从这里,我认为地址0x00000004在ARMSim#中不可写#

我将地址设置为0x00002004并且有效。

MOV r1, #0x800
ADD r1, r1, r1
ADD r1, r1, r1
MOV r2, #4
ADD r1, r1, r2

MOV r2, #15

STR r2,[r1]

LDR r3, [r1]

SWI 0x11

答案 1 :(得分:0)

Starting Address of Main Memory中的Main Memory标签中设置Files > Preferences似乎在ARMSim#Version 1.9.1(20500)中有效,但我不确定这是否安全,因为该位置的数据不是81818181,用于填充内存。

答案 2 :(得分:0)

ARMSim#的默认内存映射似乎有RAM从0x1000开始,代码放在开头,内存总量是代码大小的总和(向上舍入到下一个KB)加上半主机堆和堆栈大小。因此,假设默认配置,您从0x1000到0x11400有65k的RAM。超出该范围的地址不是内存,因此不会按预期工作(似乎它们只是读为零并忽略写入,而不是引发任何类型的错误),但即使在该范围内,您仍需要小心踩踏板根据你自己的指示。

不是使用硬编码地址,最好为代码中的变量专门分配空间(使用.word和朋友),然后你可以参考符号并让汇编程序担心获取实际地址对 - 这样你也可以很好地了解adr(和/或ldr=伪操作)和ldr / str的文字形式。或者对于真正的临时存储,使用堆栈; SP寄存器的初始化已经初始化为适当的值。