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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:03:34