ARM7l架构下无法将word加载到寄存器的技术求助
问题原因及解决方法
核心错误点
1. 伪指令使用误解
你写的ldr R0, =val是ARM汇编的伪指令,它的作用是把val变量的内存地址加载到R0寄存器,而非你想要的val存储的数值(0xffffffff)。这直接导致传递给exit系统调用的不是预期数值,而是一个地址。
2. .data段未被正确链接/加载
从反汇编输出可见,ldr R0, =val生成的字面池(0xc位置)值为0x00000000,说明链接器没有把val的实际地址填充到这个位置。程序运行时R0里存的是无效地址,该地址的最低有效字节恰好是0x84(十进制132),因此bash返回的退出码为132。
修正后的代码
要加载val的内容,需先获取它的地址,再从地址中读取数值:
.global _start _start: ldr R0, =val @ 把val的地址加载到R0 ldr R0, [R0] @ 从R0指向的地址读取val的内容到R0 mov R7, #1 @ exit系统调用的调用号是1 svc 0 @ 触发系统调用 .data val: .word 0xffffffff
正确的编译链接命令
确保使用完整流程,让链接器正确处理.data段:
as -o prog.o prog.s ld -o prog prog.o
运行修正后的程序,就能得到预期的退出码255。
内容的提问来源于stack exchange,提问作者Ilya Loskutov
相关产品推荐
相关产品推荐

