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
相关产品推荐
相关产品推荐

