首页 > 解决方案 > 如何使用 Qemu 查看内存中的内容

问题描述

我正在为 Qemu 中的 armv5 connex 板尝试这个汇编程序。我正在添加两个数字并将它们存储在位置标签结果中。我无法在内存位置查看结果值 40,但寄存器值 r4 = 0x28。

    .data
val1:   .4byte 10
val2:   .4byte 30
result: .4byte 0

    .text
    .align
start:
    ldr r0, =val1
    ldr r1, =val2

    ldr r2, [r0]
    ldr r3, [r1]

    add r4, r2, r3
    ldr r0, =result
    str r4, [r0]

stop:   b stop

我的链接器脚本是

SECTIONS {
    . = 0x00000000;
    .text : {
        *(.text);
    }
    .data : {
        *(.data);
    }

}

输出

user@stretch:~/Desktop/Gnu_Toolchain/Data_In_Ram$ arm-none-eabi-nm -n data_in_ram.elf
00000000 t start
0000001c t stop
0000002c d val1
00000030 d val2
00000034 d result

info registers
R00=00000034 R01=00000030 R02=0000000a R03=0000001e
R04=00000028 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=0000001c
PSR=400001d3 -Z-- A svc32
FPSCR: 00000000
(qemu) xp /3dw 0000002C
xp: extraneous characters at the end of line
Try "help xp" for more information
(qemu) xp /3dw 0x0000002C
000000000000002c:         10         30          0
(qemu) xp /4dw 0x0000002C
000000000000002c:         10         30          0          0
(qemu) 

标签: assemblyarmqemu

解决方案


在 Connex 板上,物理地址零具有 ROM,而不是 RAM。所以你可以让 QEMU 在那里加载代码,你可以执行它,你的程序可以从中读取数据,但是代码在那里写入的任何尝试都将被忽略。这解释了您看到的结果。

您的代码要么需要能够将自身重新定位到 RAM 中,要么您应该设置链接器映射,以便它首先到达那里。Connex 板上的 RAM 从 0xA000_0000 开始。

PS:你为什么使用一个古老的基于 PXA255 的系统模型?


推荐阅读