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.
怎么了?我尝试查看其他站点,但它们的语法与我的相同,但我仍然无法使用 LDR
和 STR
将 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)加上的总和半主机堆和堆栈大小。因此,假设默认配置你有 65k 的 RAM 从 0x1000 到 0x11400。该范围之外的地址不是内存,因此不会按预期工作(似乎它们只是读取为零并忽略写入,而不是引发任何类型的错误),但是即使在该范围内,您仍然需要小心踩踏您的自己的说明。
与其使用硬编码地址,不如专门为代码中的变量分配space(使用.word
和朋友),然后您可以引用符号并让汇编程序担心获得正确的实际地址 - 这样你也有一个很好的借口来了解 adr
(and/or ldr=
伪操作)和 ldr
的文字形式/str
。或者对于真正的临时存储,使用堆栈; SP 寄存器开始时已经初始化为适当的值。
我有一个介绍性作业,要使用 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.
怎么了?我尝试查看其他站点,但它们的语法与我的相同,但我仍然无法使用 LDR
和 STR
将 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)加上的总和半主机堆和堆栈大小。因此,假设默认配置你有 65k 的 RAM 从 0x1000 到 0x11400。该范围之外的地址不是内存,因此不会按预期工作(似乎它们只是读取为零并忽略写入,而不是引发任何类型的错误),但是即使在该范围内,您仍然需要小心踩踏您的自己的说明。
与其使用硬编码地址,不如专门为代码中的变量分配space(使用.word
和朋友),然后您可以引用符号并让汇编程序担心获得正确的实际地址 - 这样你也有一个很好的借口来了解 adr
(and/or ldr=
伪操作)和 ldr
的文字形式/str
。或者对于真正的临时存储,使用堆栈; SP 寄存器开始时已经初始化为适当的值。