课程汇编代码出现段错误,请求问题排查帮助
问题排查与修复方案
核心问题: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段中,确保链接时能正确找到该符号。
修复后验证点
print_string可正确接收并传递字符串参数给_printf- 格式字符串合法,无非法内存访问
- 栈操作完全平衡,不会破坏栈帧结构
- 程序正常返回C主函数,完成运行时清理流程
内容的提问来源于stack exchange,提问作者Rhys Evans
相关产品推荐
相关产品推荐

