如何在搭载M1芯片的MacBook上编译ARM汇编代码
问题解答
1. 关于Mac自带的as汇编器
- macOS确实自带
as命令,但它不是GNU Binutils里的传统GAS汇编器,而是LLVM clang封装的汇编前端,语法规则、指令适配逻辑和你参考的Linux ARM汇编资料里的GNU as有很大差异,这是你本次报错的核心原因之一。 - 另外你当前写的是32位ARM Linux的汇编代码,M1芯片是ARM64(AArch64)架构,指令集、寄存器命名、系统调用规则完全不兼容,这也是报错的核心原因。
2. 是否需要更换编译器
不需要完全更换,你可以根据学习方向二选一:
- 如果你就是想跑你当前写的32位ARM汇编代码:可以安装qemu来模拟32位ARM Linux环境,直接使用环境内的GNU as编译运行即可。
- 如果你想学习M1原生的ARM64汇编:直接用自带的
as就可以,但需要调整你的代码语法和指令规则适配Apple ARM64汇编要求,适配后的Hello World示例写法如下:
.global _main .section __TEXT,__text _main: mov x0, #1 adrp x1, message@PAGE add x1, x1, message@PAGEOFF mov x2, #13 mov x16, #4 svc #0x80 mov x0, #0 mov x16, #1 svc #0x80 .section __DATA,__data message: .ascii "Hello, World\n"
对应的编译链接命令如下:
as first.asm -o hello.o ld hello.o -o hello -lSystem -syslibroot `xcrun -sdk macosx --show-sdk-path`
3. M1芯片学习汇编的合理性
- 用M1学习ARM汇编非常合理,本身就是原生ARM64架构,运行、调试汇编代码不需要额外模拟开销,比在x86设备上模拟ARM的体验好很多。
- 不能直接原生运行x86汇编代码,但可以通过Rosetta 2转译运行x86架构的程序,也可以安装qemu、UTM等工具模拟x86环境,在模拟环境内编写、运行x86汇编代码。
内容的提问来源于stack exchange,提问作者cachedcashew
相关产品推荐
相关产品推荐

