Assembly 为什么STR只适用于0x40000000和0x40003FFF之间的地址?

Assembly 为什么STR只适用于0x40000000和0x40003FFF之间的地址?,assembly,arm,keil,arm7,Assembly,Arm,Keil,Arm7,代码: 此代码将值2写入内存位置0x40000000。 当我将其更改为0x20000000时,2无法写入其中。0x3FFFFFFF也是这样。当我将内存位置设置为0x40003FFF时,2将被打印到该位置,但当我将地址更改为0x40004000时,2将无法打印到该位置。对于更高的地址位置,如0x50000000,情况也一样。因此,根据这些输出,STR似乎只将值写入0x40000000到0x40003FFF之间的有限内存范围 有人知道为什么会这样吗?还是我的代码有问题?我使用的是Keil uVisi

代码:

此代码将值2写入内存位置0x40000000。 当我将其更改为0x20000000时,2无法写入其中。0x3FFFFFFF也是这样。当我将内存位置设置为0x40003FFF时,2将被打印到该位置,但当我将地址更改为0x40004000时,2将无法打印到该位置。对于更高的地址位置,如0x50000000,情况也一样。因此,根据这些输出,STR似乎只将值写入0x40000000到0x40003FFF之间的有限内存范围


有人知道为什么会这样吗?还是我的代码有问题?我使用的是Keil uVision5,NXP LPC2140。

我找不到“LPC2140”的数据表,但我找到了一个似乎是一系列设备的数据表,您拥有的特定设备可能是LPC2142/2144。第6.4节显示了SRAM映射到
0x40000000-0x40003FFF
(假设您拥有16KB的SRAM变体)。这是您应该视为通用RAM的唯一地址空间。根据数据表,超出该范围的一切看起来都很可怕,除非你完全知道自己在做什么,否则你应该避免


你还应该认识到一件事,那就是
STR
一次写入一个完整的字(4个字节),因此地址应与字边界对齐
0x40003FFF
未与4字节边界对齐;您应该改为向
0x40003FFC
写入。如果您只想将一个字节写入
0x40003FFF
,您应该使用
STRB

我找不到“LPC2140”的数据表,但我找到了一个似乎是一系列设备的数据表,您拥有的特定数据表可能是LPC2142/2144。第6.4节显示了SRAM映射到
0x40000000-0x40003FFF
(假设您拥有16KB的SRAM变体)。这是您应该视为通用RAM的唯一地址空间。根据数据表,超出该范围的一切看起来都很可怕,除非你完全知道自己在做什么,否则你应该避免


你还应该认识到一件事,那就是
STR
一次写入一个完整的字(4个字节),因此地址应与字边界对齐
0x40003FFF
未与4字节边界对齐;您应该改为向
0x40003FFC
写入。如果您只想将一个字节写入
0x40003FFF
,则应该使用
STRB

您阅读了文档是吗?您不明白的部分是什么?@old_timer文档?你是说Keil的STR参考指南?对你是说在调试阶段内存中发生了什么?是的。@phuclv-Hmm,我想你在这里撒了一条红鲱鱼。OP更改了“dest eq”,因此R1包含他想要写入的地址,不需要立即或移位或任何类似的操作。(请参阅)以获取LDR伪指令。我相信,当他试图写入只读/不存在的内存或类似的内容时,写入尝试就会失败。在不了解环境的情况下,很难对此发表评论(我在他的前一个问题中问过)。NXP LPC2140似乎只有16kB的SRAM(静态随机访问内存),可以保存值并可以修改。似乎它被映射到地址空间0x40000000..0x40003FFF。。。您应该能够在您的平台的数据表中或在其附带的示例中找到此“映射”信息。(16kiB的内存意味着16384字节……这可能比这个网页所拥有的要少,所以你在为它设计代码时必须小心,以便有效地使用内存)。@JohnPark当你开始使用微控制器时,你要做的第一件事就是下载数据表。现在,在这种情况下,根据供应商的不同,您还可以获得一本程序员参考手册,该手册可能因名称、用户手册、参考手册而有所不同。从他们那里你可以看到,他们为这个芯片购买了一个ARM内核,所以你可以转到ARM,获得架构参考手册和技术参考手册。以及任何工具手册,然后你可以开始工作。在这些手册中,您可以看到内存映射以及其他您做错的事情。您阅读了文档是吗?您不明白的部分是什么?@old_timer文档?你是说Keil的STR参考指南?对你是说在调试阶段内存中发生了什么?是的。@phuclv-Hmm,我想你在这里撒了一条红鲱鱼。OP更改了“dest eq”,因此R1包含他想要写入的地址,不需要立即或移位或任何类似的操作。(请参阅)以获取LDR伪指令。我相信,当他试图写入只读/不存在的内存或类似的内容时,写入尝试就会失败。在不了解环境的情况下,很难对此发表评论(我在他的前一个问题中问过)。NXP LPC2140似乎只有16kB的SRAM(静态随机访问内存),可以保存值并可以修改。似乎它被映射到地址空间0x40000000..0x40003FFF。。。您应该能够在您的平台的数据表中或在其附带的示例中找到此“映射”信息。(16kiB的内存意味着16384字节……这可能比这个网页所拥有的要少,所以你在为它设计代码时必须小心,以便有效地使用内存)。@JohnPark当你开始使用微控制器时,你要做的第一件事就是下载数据表。现在,在这种情况下,根据供应商的不同,您还可以获得一本程序员参考手册,该手册可能因名称、用户手册、参考手册而有所不同。从他们那里你可以看到,他们为这个芯片购买了一个ARM内核,所以你可以转到ARM,获得架构参考手册和技术参考手册。以及任何工具手册,然后你可以开始工作
dest EQU 0x40000000

AREA name, CODE, READONLY

ENTRY

MOV r0, #2  
LDR r1, =dest   
STR r0, [r1]    
stop B stop

END