NASM Linux下无法使用两个文件变量创建/打开文件的问题
NASM汇编代码问题修复方案
问题1:file_name文件无法创建/写入的原因及修复
核心错误点
- 文件名缺少空终止符:Linux系统调用(如
sys_creat、sys_open)要求文件名是以0x00结尾的C风格字符串,原代码中file_name和Nile_2的定义只写了文件名,未添加终止符,导致内核识别的文件名是乱码,无法正确创建/打开。 - 文件描述符存储空间不足:原代码用
resb 1分配1字节存储文件描述符,但x86 Linux系统调用返回的文件描述符是32位整数,1字节会截断数据,导致后续操作失败。 - 关闭文件的系统调用缺失:原代码中关闭
fd_out时,未执行int 0x80调用内核,文件未正确关闭,写入的数据无法刷新到磁盘。
修复后的代码片段(关键部分)
section .data ; 文件名必须添加0x00作为终止符 file_name db 'myfile.txt', 0x00 Nile_2 db '/home/mark/Desktop/mynewfile.txt', 0x00 section .bss ; 用resd分配4字节存储32位文件描述符 fd_out resd 1 fd_in resd 1
补全关闭文件的系统调用:
; 关闭文件 mov eax, 6 mov ebx, [fd_out] int 0x80 ; 原代码缺失这一行,必须添加才能完成关闭操作
问题2:gcc编译失败的解决
gcc默认会链接C标准库,期望程序入口为main而非_start,提供两种解决方式:
- 修改入口为main:将代码中的
global _start改为global main,_start:改为main:,编译命令:
(gcc -nostdlib -m32 yourfile.asm -o yourfile-m32指定编译32位程序,匹配原代码的32位系统调用int 0x80) - 保留_start,禁用标准库链接:保持
global _start不变,分步编译链接:nasm -f elf32 yourfile.asm -o yourfile.o gcc -m32 -nostdlib yourfile.o -o yourfile
完整修复代码
section .data msg db 'Welcome to Assembly programming', 0xa len equ $ - msg msg_done db 'Written to file ', 0xa len_done equ $ - msg_done file_name db 'myfile.txt', 0x00 Nile_2 db '/home/mark/Desktop/mynewfile.txt', 0x00 section .bss fd_out resd 1 fd_in resd 1 info resb 26 section .text global _start _start: ; 创建文件 mov eax, 8 mov ebx, file_name mov ecx, 0777 int 0x80 mov [fd_out], eax ; 写入文件 mov edx, len mov ecx, msg mov ebx, [fd_out] mov eax, 4 int 0x80 ; 关闭文件 mov eax, 6 mov ebx, [fd_out] int 0x80 ; 打印写入完成提示 mov eax, 4 mov ebx, 1 mov ecx, msg_done mov edx, len_done int 0x80 ; 打开文件 mov eax, 5 mov ebx, Nile_2 mov ecx, 0 mov edx, 0777 int 0x80 mov [fd_in], eax ; 读取文件 mov eax, 3 mov ebx, [fd_in] mov ecx, info mov edx, 26 int 0x80 ; 关闭文件 mov eax, 6 mov ebx, [fd_in] int 0x80 ; 打印读取内容 mov eax, 4 mov ebx, 1 mov ecx, info mov edx, 26 int 0x80 ; 退出程序 mov eax, 1 int 0x80
内容的提问来源于stack exchange,提问作者NanoNebulas
相关产品推荐
相关产品推荐

