Linux下汇编语言如何将数据写入外部文件?含代码示例
Linux下汇编语言写入外部文件的实现
Linux下的汇编程序通过调用**系统调用(syscall)**完成文件操作,核心步骤是「打开/创建文件」→「写入数据」→「关闭文件」。下面以x86_64架构为例,实现将内容"1111 0000"写入目标文件(示例中对应output.s,如需写入其他文件,替换文件名即可)。
完整代码示例
.include "output.s" ; 按需求包含指定文件 .data filename: db "output.s", 0 ; 目标文件名,以0结尾(C风格字符串) content: db "1111 0000", 0xA ; 要写入的内容,0xA为可选换行符 len: equ $ - content ; 自动计算内容长度,避免手动统计错误 .text .global _start _start: ; 1. 打开/创建文件 mov rax, 2 ; x86_64下sys_open的系统调用号为2 mov rdi, filename ; 第一个参数:文件名地址 mov rsi, 0x211 ; 打开标志:O_WRONLY(0x1) | O_CREAT(0x200) | O_TRUNC(0x100) mov rdx, 0644o ; 文件权限:八进制0644(所有者读写,其他只读) syscall ; 触发系统调用,返回的文件描述符存于rax ; 2. 写入数据到文件 mov rdi, rax ; 第一个参数:文件描述符(来自open的返回值) mov rax, 1 ; x86_64下sys_write的系统调用号为1 mov rsi, content ; 第二个参数:待写入数据的内存地址 mov rdx, len ; 第三个参数:数据长度 syscall ; 触发系统调用 ; 3. 关闭文件 mov rax, 3 ; x86_64下sys_close的系统调用号为3 syscall ; 触发系统调用 ; 正常退出程序 mov rax, 60 ; x86_64下sys_exit的系统调用号为60 mov rdi, 0 ; 退出码0表示无错误 syscall
关键细节说明
- 系统调用号:x86_64架构的系统调用号可通过
man syscalls命令查看,不同架构(如i386)的调用号会有差异。 - 打开标志:
0x211组合表示「只写打开,文件不存在则创建,存在则清空内容」;若需要追加内容,可替换为O_WRONLY | O_CREAT | O_APPEND(对应十六进制0x201)。 - 文件权限:
0644o是八进制表示,对应十进制420,符合Linux通用的文件权限规则。 - 内容长度计算:
equ $ - content会自动计算从content标签到当前行的字节数,无需手动统计,减少出错概率。
编译运行方法
使用nasm和ld工具编译运行:
nasm -f elf64 your_program.asm -o your_program.o ld your_program.o -o your_program ./your_program
执行后查看output.s文件,即可看到写入的"1111 0000"内容。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

