nasm linux x64 如何找到和 cmp EOF 停止将数据从文件打印到屏幕

nasm linux x64 how do i find and cmp EOF to stop printing data from file to screen

提问人:NanoNebulas 提问时间:7/25/2022 最后编辑:Sep RolandNanoNebulas 更新时间:7/27/2022 访问量:124

问:

nasm linux x64 如何找到和 cmp EOF 停止将数据从文件打印到屏幕


section .data
 
Nile_2 db '/home/mark/Desktop/mynewfile.txt', 0;
  

section .bss
 fd_out resd 4  ; use this here instead of resb so there is enough room for long file names
 fd_in  resd 4
 info resd  26

section .text
   global _start         ;must be declared for using gcc
    
_start:
;open the file for reading
   mov rax, 5
   mov rbx, Nile_2      ; was file_name
   mov rcx, 0             ;for read only access
  ; mov rdx, 0777          ;read, write and execute by all
   int  0x80
    
   mov  [fd_in], eax
   ;mov rdx, 20
READ:    
   ;read from file
   mov rax, 3
   mov rbx, [fd_in]
   mov rcx, info
   ;mov rdx, 26
   int 0x80
    
      
    
   ; print the info 
   mov rax, 4
   mov rbx, 1
   mov rcx, info
   ;mov rdx, 26
   int 0x80
   
   mov r10, info                 ; dec rdx
   cmp r10, 00
   jnz READ
   ;jmp READ           ;jnz Read
HERE:   

   ; close the file
   mov rax, 6
   mov rbx, [fd_in]
   int  0x80 
       
   mov  eax,1             ;system call number (sys_exit)
   int  0x80              ;call kernel

如何确定 sys_read 或 info 是否为零 如何找出 EOF ???我不知道如何使用sys_read来检查是否没有读取字节......当我尝试 CMP 该信息读取为零字节时,我一遍又一遍地获得最后几个字节???

Linux 汇编 x86-64 NASM EOF

评论


答:

0赞 NanoNebulas 7/25/2022 #1

我发现如果我检查 EAX 并且如果它为零,那就是文件的结尾

cmp rax, 0
   je HERE
'''
so that there does the job and not it will end almost properly when it reaches the end of the file it does spit out an extra bit tho dont know why

评论

0赞 Peter Cordes 7/27/2022
检查读取返回值时,不妨将错误(负返回值)与 EOF 相同。.通常,系统调用错误返回是 ,但不能返回任何不是错误的负值。(返回类型是 ,Linux 最多在一次系统调用中读取,即使在 64 位系统上也是如此。man7.org/linux/man-pages/man2/read.2.html#NOTESjle eof-4095 .. -1readssize_t0x7ffff000)
1赞 Sep Roland 7/27/2022 #2

您正在 64 位代码中使用。通常,在 64 位代码中,您将使用该指令并使用其他寄存器参数。有关一些简单的阅读,请参阅如果在 64 位代码中使用 32 位 int 0x80 Linux ABI 会发生什么?int 0x80syscall

如何确定 OR 信息是否为零 如何找出 EOF ???sys_read

如果从文件中读取特定字节数的请求报告的计数小于请求的数字,则已达到文件末尾。如果报告的计数为 0,则在您发出请求之前已达到文件末尾,否则我们说读取了部分记录。

我不知道如何使用来检查是否没有读取字节......sys_read

sys_read提供在寄存器中实际读取的字节数。我在回答您之前的问题 Nasm linux 时已经提到过这一点,出于某种原因,我不能同时使用两个文件变量名来打开文件和创建文件?eax

当我尝试 CMP 该信息为零字节读取时,我一遍又一遍地获得最后几个字节???

你已经成功地创造了一个无限循环!
在 NASM 中,像这样的指令加载寄存器中的信息地址。所以不是存储在信息中的内容,这是你试图得到的。
由于地址不为零,因此代码如下:
mov r10, info

mov r10, info
cmp r10, 00
jnz READ

将始终跳跃,从而无限期地继续循环。


fd_out resd 4  ; use this here instead of `resb` so there is **enough room for long file names**
fd_in  resd 4
info resd  26

寄存器中返回的内容是一个文件描述符(它位于名称 fd_infd_out 中),它是系统可以识别打开的文件的句柄。它是一个 dword,分配 4 个 dword 来存储是没有意义的。sys_creatsys_openeax

另外,我觉得很奇怪,作为对我之前答案的回应,你变成了.这没有多大意义。info resb 26info resd 26

这次使用 64 位寄存器时,您确实在 fd_in 变量上引入了另一个不匹配!如果您存储了 d字 (),则不要检索 q字 (mov [fd_in], eaxmov rbx, [fd_in])


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

    ...

READ:
    ;read from file
    mov  edx, 26
    mov  ecx, info
    mov  ebx, [fd_in]
    mov  eax, 3
    int  0x80        ; -> EAX
    test eax, eax
    js   ERROR       ; Some error occured
    jz   HERE        ; End-of-file
    ; print the info 
    mov  edx, eax    ; Could be a partial record
    mov  ecx, info
    mov  ebx, 1
    mov  eax, 4
    int  0x80
    jmp  READ
ERROR:

HERE: