如何在Linux x86中使用nasm以汇编语言保存文件?

时间:2013-11-10 20:28:27

标签: linux file assembly io nasm

我只是想知道如何将缓冲区扔到文件中。我知道我可以设置寄存器,如:

mov eax, 4
mov ebx, (file descriptor here)
mov ecx, myBuffer
mov edx, myBufferLen
int 80h

然后使用以下命令关闭文件:

mov eax, 6
int 80h

但我不确定如何获取文件描述符。有人告诉我,无论何时打开文件,在调用服务调度程序之后,eax都有文件描述符。无论我尝试什么,它都不会创建新文件或保存当前文件。

2 个答案:

答案 0 :(得分:0)

mov eax, 5 ; __NR_open
mov ebx, filename ; zero terminated!
mov ecx, 2 ; O_WRITE? Check me on this!
mov edx, 777q ; permissions - Check me on this, too!
int 80h
; did we succeed?
cmp eax, -4096
ja exit
mov [descriptor], eax
; and so on...
;...
xor eax, eax ; claim no error
exit:
mov ebx, eax
neg ebx
mov eax, 1 ; __NR_exit
int 80h

我不确定开放标志和权限的“神奇数字”,而且现在懒得查看它们(fs.h?)。您可能需要使用O_CREATE“或”打开标志来创建新文件(?)。 “退出:”的技巧否定了(负面)ERRNO(如果有的话),因此您可以使用“echo $?”轻松阅读它。像那样......

答案 1 :(得分:0)

感谢@gnometorule解决方案。这就是将缓冲区存储到文件中的方法: 在这种情况下,当您运行程序时,您将收到文件名作为第一个参数。

section .text
    global _start

_start:

    pop ebx ; this is the amount of parameter received (in this case 2)
    pop ebx ; this is the direction of our program
    pop ebx ; this is the first parameter (our file name eg. "text.txt") 

所以我们打开它并将其移动到缓冲区进行编辑或任何我们想要的东西。

textEdit:

    ;we open the file

    mov eax, 5
    push ebx   ; we save the file name in the stack for later use
    mov ecx,0 
    int 80h

    ; and then we move the information read to buffer

    mov eax, 3
    mov ebx, eax             ; really dont know how this works, but it does.
    mov ecx, fileBuffer
    mov edx, fileBufferSize
    int 80h 

现在fileBuffer(这是一个在.bss中定义的缓冲区)具有我们打开的文件中的内容。在这里,您可以编辑信息。当我们想将它保存回文件时,它会像这样:

saveFile:

        ;open the file

    mov eax, 5
    pop ebx                ; the file name was stored in the stack, 
    push ebx               ; so we retrieve it and save it back for later use
    mov ecx, 2             ; ecx has the access mode ("2"aloud us to read/write) 
    mov edx, $0666 
    int 80h

        ;now we are going to write to the file

    mov ebx, eax               ; eax has the file descriptor we opened. so we move it to ebx.
    mov eax, 4                 ; we are going to use the write service (#4)
    mov ecx, fileBuffer        ; ecx has the adress of what we want to write
    mov edx, fileBufferSize    ; edx has the amount of bytes we want to write
    int 80h

        ; close the file

    mov eax, 6
    int 80h

    jmp exit  ; jump wherever you want, or end your program... etc.

这对我有用。