如何在NASM汇编中调用C库fprintf函数及运行异常排查
问题原因分析
- 核心问题:文件名缺少C字符串必需的NULL结束符
C标准库所有字符串处理函数(包括fopen)都要求输入字符串以\0(数值0)作为结束标记。你代码中intFilename的定义仅声明了字符内容:
intFilename: db "Project4_int.txt"
末尾未补0,导致fopen读取文件名时会持续向后读取相邻内存数据,直到遇到第一个0值。你代码里intFilename之后紧接着定义的是write_char: db 'w', 0,所以最终传给fopen的文件名会自动拼接上末尾的w,和你观察到的文件名异常现象完全吻合。文件打开失败后fopen会返回NULL,后续传入NULL指针调用fprintf自然不会写入任何内容。
- 缺少
fopen错误检查逻辑
你调用fopen后没有判断返回值是否为NULL,直接将返回值存入intfdes使用,一旦打开失败无法及时感知。 - 写入完成后未调用
fclose刷新缓冲区
C库的文件IO默认带缓冲区,写完内容后如果没有调用fclose关闭文件,程序直接退出时缓冲区的内容可能还没刷入磁盘,也会导致输出文件为空。
修复后的代码示例
section .data write_char: db 'w', 0 ; 文件名末尾补0,符合C字符串要求 intFilename: db "Project4_int.txt", 0 intfdes: dd 0 format: db "%d", 10, 0 section .text ; 打开文件 push dword write_char push dword intFilename call fopen add esp, 8 ; 检查fopen返回值,为NULL则跳过后续写入 cmp eax, 0 je open_failed mov [intfdes], eax ; 写入内容 push dword [intArray + 4] push dword format push dword [intfdes] call fprintf add esp, 12 ; 关闭文件,刷入缓冲区 push dword [intfdes] call fclose add esp, 4 open_failed: ; 后续退出逻辑
内容的提问来源于stack exchange,提问作者Nick7902
相关产品推荐
相关产品推荐

