使用linux系统调用“read”来读取文件的一个字符

时间:2014-03-20 22:51:40

标签: linux call system nasm

所以我尝试使用nasm读取linux系统调用一次读取一个文件,但无论我指定的是什么,它都会读取整个文件。 我知道read有3个参数,第一个是文件描述符,第二个是写入数据的缓冲区,第三个是要读取的字节数。我有以下内容。我省略了很多代码,因为这只是一个更大的项目的一部分

 section .data 
 bufsize: db 1 

 section .bss
 buf  resb 256

 ; read the file
    mov     eax,  3         ; read(
    mov     ebx,  [file_pointer]       ;   file_descriptor,
    mov     ecx,  buf       ;   *buf,
    mov     edx,  bufsize   ;   *bufsize
    int     80h             ; );

 ; write to STDOUT
    mov     edx, eax        ; move number of bytes read into edx
    mov     eax, 4          ; system call for write
    mov     ebx, 1          ; STDOUT file descriptor
                            ; ecx is already set up. its the buffer
    int     80h             ; call kernel

然而,当我使用系统调用来编写buf中的内容时,它会打印出整个文件,而不仅仅是第一个字符。我知道我的文件指针是正确的。我觉得我必须宣布我的bufsize错误。

1 个答案:

答案 0 :(得分:0)

来自the manpage for read

ssize_t read(int fd, void *buf, size_t count);

如您所见,第三个参数是要读取的字节数,而不是指向要读取的字节数的指针。

代码中的这一行:

mov     edx,  bufsize   ;   *bufsize

应该是:

mov     edx,  [bufsize]   ;   bufsize

bufSize应声明为:

bufsize: dd 1 

(或者你可以做mov edx,1