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

x86汇编(AT&T语法)无法创建新文件问题求助

问题分析与修复

你的代码存在几个关键错误,导致文件无法正常生成或写入:

  • sys_write调用号错误:32位Linux下,sys_write的系统调用号是4,不是你写的1(1是sys_exit的调用号)。
  • 未触发write系统调用:即使调用号正确,你在准备好write的所有参数后,没有执行int $0x80,写入操作根本没执行。
  • open的flags参数错误:你用的0x202没有包含创建文件的O_CREAT标志(值为0x40)。正确的创建并写入文件的flags应该是O_WRONLY | O_CREAT | O_TRUNC,即0x241——缺少O_CREAT的话,当目标文件不存在时open会失败,返回负数文件描述符。
  • write长度参数错误:你给write指定了长度18,但debug_msg的实际长度是15,这会导致写入超出字符串范围的垃圾数据。
  • 缺少程序退出逻辑:main函数末尾没有调用sys_exit,程序会以不确定的状态退出,可能掩盖错误。
  • 冗余栈操作:多次push/pop文件描述符完全可以简化,直接用寄存器存储更高效。

修正后的代码

.att_syntax
.section .text
.global main

main:
    # 打印调试信息
    movl $4, %eax               # sys_write 系统调用号
    movl $1, %ebx               # stdout 文件描述符
    movl $debug_msg, %ecx       # 输出字符串
    movl $15, %edx              # 字符串长度
    int $0x80                   # 触发系统调用

    # 创建并打开文件
    movl $2, %eax               # sys_open 系统调用号
    movl $filename, %ebx        # 文件名
    movl $0x241, %ecx           # flags: O_WRONLY | O_CREAT | O_TRUNC
    movl $0x644, %edx           # 文件权限:所有者读写,其他只读
    int $0x80                   # 触发系统调用
    cmpl $-1, %eax              # 检查open是否失败
    je exit_error               # 失败则跳转到错误退出

    # 写入内容到文件
    movl $4, %eax               # sys_write 系统调用号
    movl %eax, %ebx             # 将open返回的文件描述符移到%ebx
    movl $debug_msg, %ecx       # 要写入的字符串
    movl $15, %edx              # 字符串长度
    int $0x80                   # 触发系统调用

    # 关闭文件
    movl $3, %eax               # sys_close 系统调用号
    int $0x80                   # 触发系统调用

exit_success:
    movl $1, %eax               # sys_exit 系统调用号
    movl $0, %ebx               # 成功退出状态码
    int $0x80

exit_error:
    movl $1, %eax               # sys_exit 系统调用号
    movl $1, %ebx               # 错误退出状态码
    int $0x80

.section .data
debug_msg:
    .string "Debug String :)"

filename:
    .string "out.txt"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:33:20