Intel Mac下x86 AT&T语法汇编代码报错求助(Linux可正常编译)
Intel Mac下汇编x86 AT&T代码编译报错的解决方法
问题根源
你的代码在Linux上正常但Mac上报错,核心原因是Mac的GNU汇编器(GAS)与Linux版本在语法细节、系统调用机制上存在差异,具体体现在section定义语法、程序入口点、系统调用方式三个方面。
具体修正步骤
1. 修正Section定义语法
Mac的GAS不支持.section .data/.section .text这种Linux风格的写法,直接用简化的伪指令.data和.text即可。
2. 调整程序入口点
Mac上gcc链接时默认寻找_main作为入口(而非Linux的_start),如果坚持用_start需要额外链接参数,但更简便的是改为_main。
3. 替换系统调用代码
Linux的int $0x80系统调用在Mac上不生效,需要改用Mac的syscall指令,且系统调用号和参数传递规则不同:
- exit的系统调用号是
0x2000001 - 退出码需要放在
%edi寄存器
修改后的完整代码
.data data_items: .long 3, 67, 34, 222, 45, 75, 54, 34, 44, 33, 22, 11, 66, 0 .text .globl _main _main: movl $0, %edi movl data_items(,%edi, 4), %eax movl %eax, %ebx start_loop: cmpl $0, %eax je loop_exit incl %edi movl data_items(,%edi, 4), %eax cmpl %ebx, %eax jle start_loop movl %eax, %ebx jmp start_loop loop_exit: # Mac exit系统调用:0x2000001,退出码存%edi movl $0x2000001, %eax movl %ebx, %edi # 将最大值作为退出码,方便后续查看 syscall
编译运行命令
编译:gcc maximum.s -o maximum
运行:./maximum
查看运行结果(最大值会作为程序退出码,可通过以下命令查看):echo $?
补充说明
如果一定要保留_start作为入口,编译时需要指定链接入口点:gcc -e _start maximum.s -o maximum
但这种方式会跳过标准库初始化,日常使用建议还是用_main更稳妥。
内容的提问来源于stack exchange,提问作者Abi Prescott
相关产品推荐
相关产品推荐

