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

问题描述 投票:0回答:1

码:

dest EQU 0x40000000

AREA name, CODE, READONLY

ENTRY

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

END

此代码将值2写入内存位置0x40000000。当我将其更改为0x20000000时,2无法写入。与0x3FFFFFFF相同。当我将内存位置设置为0x40003FFF时,2会被打印到该位置,但是当我将地址更改为0x40004000时,2无法在那里打印。任何更高的地址位置都是一样的,比如0x50000000。因此根据这些输出,似乎STR只将值写入0x40000000和0x40003FFF之间的有限内存范围。

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

assembly arm keil arm7
1个回答
2
投票

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

你应该认识到的一件事是unaligned accessSTR一次写入一个完整的字(4个字节),因此地址应该在字边界上对齐。 0x40003FFF未与4字节边界对齐;你应该写信给0x40003FFC。如果你只是想向0x40003FFF写一个字节,你应该使用STRB代替。

© www.soinside.com 2019 - 2024. All rights reserved.