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

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

我在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
assembly arm arm7
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体系结构允许您将代码区域用作数据(因此可以在代码中嵌入litterals,并像访问变量一样访问)。它不保证可以修改代码存储区。

Fig 4-1 from ARM100894_0000_00_en

图4-1来自ARM100894_0000_00_en

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