assembly - 如何使用 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)
解决方案
在 Connex 板上,物理地址零具有 ROM,而不是 RAM。所以你可以让 QEMU 在那里加载代码,你可以执行它,你的程序可以从中读取数据,但是代码在那里写入的任何尝试都将被忽略。这解释了您看到的结果。
您的代码要么需要能够将自身重新定位到 RAM 中,要么您应该设置链接器映射,以便它首先到达那里。Connex 板上的 RAM 从 0xA000_0000 开始。
PS:你为什么使用一个古老的基于 PXA255 的系统模型?
推荐阅读
- c++ - 带有 clangd 完成器的 YouCompleteMe vim 插件似乎无法正常工作
- javascript - 添加新的麻烦
- 至
- 用javascript点击
- 至
- tensorflow - 嵌入层输出形状为 2D
- javascript - 无法从 React 客户端向服务器发送数据
- firebase - nuxt存储模块模式下的firebase身份验证
- javascript - 使用 Javascript 创建表(tableee 添加)
- c# - 使用 c#.net 窗口窗体注册条形码扫描仪并仅从扫描仪接收数据
- sql - SQL Server 查询更新重复记录
- chef-infra - [chef]:查看节点上所有可用的数据包
- ios - UIModalTransitionStylePartialCurl 使我的应用程序崩溃