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

NASM Linux下无法使用两个文件变量创建/打开文件的问题

NASM汇编代码问题修复方案

问题1:file_name文件无法创建/写入的原因及修复

核心错误点

  1. 文件名缺少空终止符:Linux系统调用(如sys_creat、sys_open)要求文件名是以0x00结尾的C风格字符串,原代码中file_name和Nile_2的定义只写了文件名,未添加终止符,导致内核识别的文件名是乱码,无法正确创建/打开。
  2. 文件描述符存储空间不足:原代码用resb 1分配1字节存储文件描述符,但x86 Linux系统调用返回的文件描述符是32位整数,1字节会截断数据,导致后续操作失败。
  3. 关闭文件的系统调用缺失:原代码中关闭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,提供两种解决方式:

  1. 修改入口为main:将代码中的global _start改为global main,_start:改为main:,编译命令:
    gcc -nostdlib -m32 yourfile.asm -o yourfile
    
    (-m32指定编译32位程序,匹配原代码的32位系统调用int 0x80)
  2. 保留_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:57:17