我有一个介绍性的任务是使用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。
它出了什么问题?我尝试查找其他网站,但他们的语法与我的相同,但我仍然无法使用LDR
和STR
将r2内容放入r3。我知道我可以使用MOV
来做到这一点,但我的目的是学习一些新的指示。
答案 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寄存器的初始化已经初始化为适当的值。