繁体   English   中英

STR / LDR到ARMSim#中的内存

[英]STR/LDR to memory in ARMSim#

我有一个介绍性的任务,要使用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来做到这一点,但我的目的是学习一些新的说明。

我正在使用ARMSim#版本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

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

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

与其使用硬编码地址,不如专门为代码中的变量分配空间(使用.word和friends),然后可以引用这些符号,并使汇编程序担心实际地址正确无误-这样,您也可以有一个很好的借口来学习adr (和/或ldr=伪操作)和ldr / str的字面形式。 或者,对于真正的临时存储,请使用堆栈。 SP寄存器开始时已经初始化为适当的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM