You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    

修复步骤

  1. 确保编译链接时包含所有相关文件:比如你的主汇编文件和定义exit的汇编文件要一起编译,示例命令(用clang):
    clang -o test main.s exit.s
    
  2. 验证.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:40:05