汇编:尝试写入文件,但文本附加到文件名

时间:2016-12-20 04:31:48

标签: 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 的文件。

1 个答案:

答案 0 :(得分:2)

虽然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