M1 MacBook Pro上ARM汇编LDR指令加载数据异常求助
问题分析与解决
汇编代码问题原因
你的代码中执行ldr x0, =num后x0变为0x0,核心原因是符号num在链接阶段未被正确解析为有效地址,可能是编译链接命令未将包含.data段的汇编文件正确纳入,或者链接时符号未被识别。
另外需要注意:
ldr x0, =num是AArch64的伪指令,作用是将num的地址加载到x0寄存器,而非num存储的数值5。如果你想加载数值,需要先取地址再间接读取:_main: ldr x0, =num // 加载num的地址到x0 ldr w1, [x0] // 从x0指向的地址读取32位数值到w1(因为num是.word类型) b exit
修复步骤
- 确保编译链接时包含所有相关文件:比如你的主汇编文件和定义
exit的汇编文件要一起编译,示例命令(用clang):clang -o test main.s exit.s - 验证
.data段是否被正确加载:用LLDB的memory read num命令,查看num的地址和存储的数值,如果输出为0x0,说明链接时.data段未被正确处理,检查编译参数是否遗漏了段相关设置。
AArch64汇编学习工具推荐
- LLDB进阶使用:掌握这些实用命令:
disassemble -n _main:查看_main函数的实际机器码,确认伪指令是否被正确转换image list -v:查看可执行文件的段信息,确认.data段是否存在并分配了地址memory read --size 4 num:读取num存储的32位数值,验证数据是否正确
- AArch64精简指令指南:找聚焦常用指令的文档,重点掌握内存访问(ldr/str)、寄存器操作、分支指令的用法,不用啃官网的大部头手册
- 最小测试程序:写仅包含核心逻辑的汇编代码,比如只定义
_main、一个.data变量和简单的退出逻辑,逐步验证每一条指令的效果 - AArch64在线模拟器:用支持AArch64的在线模拟器,实时观察寄存器和内存变化,快速测试指令逻辑,避免本地编译链接的麻烦
- 反编译工具:用
otool -tV test反编译可执行文件的.text段,对比手写汇编和实际生成的机器码,理解伪指令的转换过程
内容的提问来源于stack exchange,提问作者Anirudh Mathur
相关产品推荐
相关产品推荐

