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 内容存储在我内存的 "address 4" 中(我知道内存地址必须是 4 的倍数),最后,r3 应该从 "address 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 > PreferencesMain Memory 选项卡中设置 Starting Address of Main Memory 似乎在 ARMSim# 版本 1.9.1 (20500) 中有效,但我不确定这是否安全,因为该位置的数据不是 81818181,用于填充内存。

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

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