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

编写C调用的汇编加法函数时触发Segmentation fault问题求助

问题分析与解决

你的段错误根源是32位汇编代码和64位编译环境不匹配:gcc默认编译64位程序,但你的汇编用了.code32声明32位指令集,导致C代码(64位)调用汇编函数(32位)时,调用约定、栈结构完全不兼容,访问[ebp+8]时栈地址无效,触发段错误。

下面给两种解决办法:

方法1:改成64位汇编(推荐,适配主流环境)

64位System V AMD64调用约定中,前两个整数参数存在rdi和rsi寄存器,返回值存在rax。修改后的汇编代码如下:

.intel_syntax noprefix
.global add

.section .text
add:
    mov eax, rdi    ; 第一个参数存rdi,移到eax
    add eax, rsi    ; 加上第二个参数rsi
    ret             ; 返回eax中的结果

编译命令不变:

gcc -Wall -o main driver.c add_two_numbers.s

方法2:强制编译32位程序

如果坚持用32位汇编,需要让gcc生成32位可执行文件,添加-m32编译参数。你的原汇编代码本身是正确的(32位cdecl调用约定下,ebp+8是第一个参数,ebp+12是第二个),只需修改编译命令:

gcc -Wall -m32 -o main driver.c add_two_numbers.s

注意:如果系统缺少32位编译依赖,需要先安装(比如Debian/Ubuntu下执行sudo apt-get install gcc-multilib)。

验证:两种方法编译后运行,都会输出14,符合预期。

内容的提问来源于stack exchange,提问作者Ishaan Dabhade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:22:14