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

汇编初学者求助:调用printString触发Segmentation Fault

解决汇编程序Segmentation Fault的问题

嘿,很高兴看到你刚入门汇编就开始动手实践啦!咱们来一步步拆解你遇到的段错误问题~

问题根源

你触发Segmentation Fault的核心原因是:传给printString的参数类型完全错了!

看你的_start代码最后部分:

argumentsEnd:
mov eax, edx
call printString

这里的edx是你计算出来的命令行参数总和(是一个整数数值),你把它放到eax里传给printString——但printString函数要求eax里存的是字符串的内存地址,不是整数!

当printString调用lenString时,lenString会执行cmp byte [eax], 0,也就是去访问eax数值对应的内存地址(比如参数和是10的话,就是访问0xA这个地址),这个地址属于系统保护的内存区域,程序没有权限访问,直接就触发段错误了。

而你参考的asmtutor教程16里,调用printString时传的应该是字符串常量的地址(比如mov eax, myString),所以能正常运行。

修复方法

你现在要打印的是整数结果,所以应该调用printInteger而不是printString!把代码里的call printString改成call printInteger就可以了:

argumentsEnd:
mov eax, edx
call printInteger  ; 这里改成printInteger
call breakLine
call quit

你的printInteger函数内部应该已经实现了把整数转成字符串再输出的逻辑(也就是类似itoa的功能),刚好匹配你的需求。

调试小技巧(给新手的小提示)

你用gdb调试的时候,可以在call printString这行之前加断点,运行到断点后用info registers eax查看eax的值,就能发现它是个小整数而不是合法的内存地址,这样就能更快定位问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:00:57