0

我在 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
4

1 回答 1

1

下面是 Cortex-M3 DesignStart Eval 的内存映射。当然,这是 Cortex-M 而不是 ATM7TDMI,但它是一个很好的例子。

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

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

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

图 4-1 来自 ARM100894_0000_00_en

图 4-1 来自 ARM100894_0000_00_en

于 2019-03-26T08:52:12.643 回答