为什么这不会改变内存中 array1 中某些元素的值?

Why won't this change the values of some of the elements in array1 in memory?

我在 Keil 上写了一些汇编代码,如果数组中的元素小于 5,程序会递增该元素。问题是,ARM 代码不会更改内存中 array1 的值。为此,我需要进行哪些更改?

    ADR r0, array1      ; loads address of 'a' to r0

    MOV r1, #0          ; r1 = index

L0  CMP r1, #8
    BGE stop
    LDR r2, [r0, r1, LSL#2] ; load content of array1[index] to r2
    CMP r2, #5
    ADDLT   r2, r2, #1      ; array1[index]++
    STRLT   r2, [r0, r1, LSL#2] ; store r2 as content of array1[index]
    ADD r1, r1, #1      ; index++
    B   L0

stop B  stop
array1  DCD 1, 7, 4, 9, 2, 3, 8, 6
    END

下面是 Cortex-M3 DesignStart Eval 的内存映射。诚然,这是 Cortex-M 而不是 ATM7TDMI,但作为示例还是不错的。

你可以在这里看到,FLASH区域,各种扩展区域,外围设备和不同类型的RAM。您可以将其与 LPC2140 的内存映射进行比较,以检查您设备的相关地址。

一般来说,对于程序代码,FLASH区域是只读的(修改FLASH需要特殊的控制序列,具体以实际为准)。此图中标记为扩展的区域什么都没有。访问这些 should 错误(从理想主义的角度来看),但也可以忽略。在 DesignStart 中,它们是供设计人员添加自己的硬件的区域。 您的代码可以可靠地用于 read/write 存储的唯一区域是 RAM 区域。 ARM-7 没有 ARMv7-M 明确定义的内存映射,但是对于 LPC2140 设备,您可以确定在 0x40000000 和 0x40001FFF 之间有 RAM(以及从 0x00000000 开始的 FLASH)。

ARM 体系结构 允许您将代码区域用作数据(因此可以将文字嵌入代码中,并像访问变量一样访问)。不保证可以修改代码内存

图 4-1 来自 ARM100894_0000_00_en