ARM7程序集内存中没有数据

时间:2016-11-02 20:16:08

标签: memory assembly arm arm7

我花了不少时间试图了解发生了什么。我甚至无法从内存中开始测试项目读取数据。

在这种情况下,我只需要将一些数据存储在内存中,读取然后处理并将其存储回内存。

这是我的代码

    AREA    RESET, CODE, READONLY
    ENTRY
    LDR   r0, =SortArray ;load start address
    LDR   r1, =SortArrayEnd ; load end address
    LDR r4, [r0]
    SUB r2, r2, #1 ; r2 contains (LENGTH-1)
    MOV r6, #0 ; r6 sum set to 0
STOP B STOP
    LTORG
    AREA my_data, DATA, READWRITE 
    ALIGN
SortArray
    DCD 1,5,20,32,13,66,3,5,23,64,112,66,22 
SortArrayEnd

    END

这是调试项目时得到的结果

enter image description here enter image description here

为什么内存中没有数据? 当然,当我从该地址读取内存时,没有任何内容被注册。

我一直试图解决它而没有成功。

这里还有一些其他相关问题。

  1. 为什么数据地址为0x40000000。这是因为我的MC(LPC2148)的内部存储器映射?从此地址开始SRAM内存。我是对的吗?
  2. 从HARDWARE和SOFTWARE的角度来看,为什么在没有= LDR template<typename T, typename MT> struct memberwise_less { MT T::* const mptr; auto operator()(const T& left, const T& right) const { return (left.*mptr) < (right.*mptr); } }; template<typename T, typename MT> memberwise_less<T, MT> member_less(MT T::*mptr) { return { mptr }; } 符号的情况下,无法直接读取存储在不同AREA中的数据?
  3. 所有通信都是通过内存地址完成的,因此其他一些外设可以只映射到特定地址并连接到内存总线?它是如何在硬件级别完成的?如何给出具体的设备/总线地址?
  4. 如果有任何帮助或建议,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

这不是一个直接的答案;只是一个使用GNU工具的例子。即使你使用不同的工具,这可能会有所帮助。

.bss
        SortArrayEnd:   .word 0
.data
        fmt:            .string "%d %d %d\n"
        SortArray:      .word 1,5,20,32,13,66,3,5,23,64,112,66,22
        .equ            len.SortArray,.- SortArray
.text
        .global main

main:
        nop
        ldr r9,=SortArray               // point to array
        ldr r10,=SortArrayEnd           // point to array

        ldr r1, [r9]                    // load array value @ element 0
        mov r2, #len.SortArray
        sub r2, r2, #4

        str r1, [r10]                   // store value into diff array element 0
        ldr r3, [r10]                   // load element 0 from diff array into GPR for printing

        bl write

exit:
        mov r7, #1
        svc 0

write:
        push {r1-r4,lr}
        ldr r0,=fmt
        bl printf
        pop {r1-r4,pc}

使用GDB进入代码,您将看到数组元素出现在数组指针

(gdb) x/16 $r9
0x20612:        1       5       20      32      13      66      3       5
0x2061a:        23      64      112     66      22      0       0       0

进一步步进,您将看到新加载的值到另一个数组指针

(gdb) x/4 $r10
0x20643:        1       0       0       0