我在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需要特殊的控制序列,特定于实际部分)。此图中标记为扩展的区域没有任何内容。访问这些应该是错误的(从理想主义的角度来看),但也可以被忽略。在DesignStart中,它们是设计人员添加自己的硬件的区域。您的代码可以可靠地用于读/写存储的唯一区域是RAM区域。 ARM-7没有明确定义的ARMv7-M内存映射,但对于LPC2140器件,可以确定0x40000000和0x40001FFF之间有RAM(以及从0x00000000开始的FLASH)。
ARM体系结构允许您将代码区域用作数据(因此可以在代码中嵌入litterals,并像访问变量一样访问)。它不保证可以修改代码存储区。
图4-1来自ARM100894_0000_00_en