为什么这不会改变内存中 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
我在 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