ARM Mac(M2)下Hello World汇编程序运行失败求助
问题根源与修复方案
核心问题分析
- 系统调用号错误:macOS ARM64的系统调用号和Linux ARM64不同,所有系统调用都需要加上
0x2000000前缀。你代码里用的4(write)和1(exit)是Linux的系统调用号,在macOS上会触发非法调用,导致进程被终止。 - 写入长度参数错误:
"Hello\n"的实际字节数是6(H、e、l、l、o、换行符),但你给X2赋值了13,这会让write系统调用试图读取超出数据段的内存,触发内存保护机制,进程被系统杀死(错误码137通常对应内存访问违规)。 - 反汇编异常的关联问题:错误的内存访问和非法系统调用会导致Mach-O文件的加载逻辑异常,进而出现
LC_THREAD.UNKNOWN_ARCHITECTURE.0这类异常段标识。
修正后的汇编代码
.global start .align 2 start: mov X0, #1 // 标准输出文件描述符 adr X1, hello // 字符串地址 mov X2, #6 // "Hello\n"的字节数 mov X16, #0x2000004 // macOS ARM64的write系统调用号 svc 0 // 触发系统调用 mov X0, #0 // exit返回码 mov X16, #0x2000001 // macOS ARM64的exit系统调用号 svc 0 hello: .ascii "Hello\n"
编译与运行验证
- 编译命令保持不变:
clang hello.s -nostdlib -static - 运行生成的
a.out,会正常输出Hello并换行。 - 用
objdump检查时,hello段的反汇编会恢复正常,也不会再出现LC_THREAD.UNKNOWN_ARCHITECTURE.0的异常标识。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

