linux - 程序集:试图写入文件,但文本附加到文件名

标签 linux assembly nasm

我正在尝试学习汇编,但在尝试教程中的示例时遇到了困难。我正在使用 ubuntu 虚拟机编译它。

代码如下:

SYS_READ equ 3
SYS_WRITE equ 4
SYS_OPEN equ 5
SYS_CLOSE equ 6
SYS_CREATE equ 8
SYS_EXIT equ 1

section .text
    global _start

_start:
    mov eax, SYS_CREATE
    mov ebx, filename
    mov ecx, 0777
    int 0x80

    mov [fd_out],ebx

    mov eax,SYS_WRITE
    mov edx,len
    mov ecx,msg
    mov ebx,[fd_out]
    int 0x80

    mov eax,SYS_CLOSE
    mov ebx,[fd_out]
    int 80h

    mov eax,SYS_OPEN
    mov ebx,filename
    mov ecx,0
    mov edx,0777
    int 0x80

    mov [fd_in],eax

    mov eax, SYS_READ
    mov ebx,[fd_in]
    mov ecx,info
    mov edx,26
    int 0x80

    mov eax,SYS_WRITE
    mov ebx,1
    mov ecx,info
    mov edx,26
    int 0x80

    mov eax,SYS_EXIT
    mov ebx,0
    int 0x80

section .data
    filename db 'test.txt'
    msg db 'Hello world file'
    len equ $-msg

section .bss
    fd_out resb 1
    fd_in resb 1
    info resb 26

执行编译输出后,我得到一个名为test.txtHello world file 的文件。

最佳答案

虽然 SYS_WRITE 接受 EDX 中信息的长度,但函数 SYS_CREATE 需要一个指向文件名的 NULL 终止字符串的指针。

你的文件名,定义为

filename db 'test.txt'

不是 NULL 终止的,这就是它与下一个字符串连接的原因:

msg db 'Hello world file'

本例中的终止 NULL 是下一个定义的:

fd_out resb 1

为了修复它,只需用零终止字节定义文件名:

filename db 'test.txt', 0

关于linux - 程序集:试图写入文件,但文本附加到文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41234938/

相关文章:

linux - Shell-fu 列出目录中包含单词或短语实例的所有文件

c 将数组传递给 nasm 函数

c - 如何用C写rotate代码编译成 `ror` x86指令?

assembly - 磁盘读取功能在引导加载程序中未按预期工作

assembly - 将堆栈中的数据弹出到命名变量中?或者用MOV存储一个寄存器?

linux - GDB 提示没有可用的资源

linux - Pascal for Linux 的简单 IDE

linux - 通过单独终端中的管道输入

android - 如何从 Ubuntu 12.04(64 位)中删除所有 Android 工具(ADB 和 fastboot)以及 SDK

assembly - 操作码的十六进制值