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

课程汇编代码出现段错误,请求问题排查帮助

问题排查与修复方案

核心问题:print_string函数的严重错误

段错误的直接原因是print_string函数完全未正确处理传入参数,且存在未定义符号、栈平衡错误:

1. 未读取传入的字符串参数

调用print_string时,你会将字符串地址压入栈(比如push name_prompt),但print_string完全没从栈中获取该参数,反而错误地将eax压栈后调用_printf,导致_printf接收无效地址,触发段错误。

2. 未定义string_format符号

print_string中使用的string_format未在任何代码段定义(该常量应为"%s"格式字符串),会导致链接错误或运行时非法内存访问。

3. 栈平衡错误

调用_printf后用pop ecx两次清理栈的操作不规范,按cdecl调用约定,应使用add esp, 8来清理两个压入栈的参数。

修复后的print_string函数

section .data
    string_format db "%s", 0  ; 补充定义printf所需的字符串格式

section .text
print_string:
    enter   0,0
    pusha
    pushf

    ; 从栈中获取传入的字符串参数:ebp+8 对应调用时压入的第一个参数
    push    dword [ebp+8]
    push    dword string_format
    call    _printf
    add     esp, 8  ; 清理printf的两个参数,保持栈平衡

    popf
    popa
    leave
    ret

其他次要问题修复

1. asm_main的退出方式错误

你使用int 0x80直接调用系统退出,但asm_main是被C主函数调用的,直接退出会跳过C运行时的清理流程,应改为正常返回:

end_loop:
    ; 替换原有的int 0x80退出逻辑
    mov eax, 0           ; 返回0表示程序执行成功
    leave
    ret

2. read_char_loop的冗余操作

调用read_char_loop时执行的lea eax, [name]完全冗余,函数内部并未使用eax的值,直接调用call read_char_loop即可。

3. 格式字符串的位置

将string_format的定义放在asm_io.asm的.data段中,确保链接时能正确找到该符号。

修复后验证点

  1. print_string可正确接收并传递字符串参数给_printf
  2. 格式字符串合法,无非法内存访问
  3. 栈操作完全平衡,不会破坏栈帧结构
  4. 程序正常返回C主函数,完成运行时清理流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:44:59