编写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
相关产品推荐
相关产品推荐

