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

ws51t4hk  于 2022-11-13  发布在  Linux
关注(0)|答案(2)|浏览(184)

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该信息是零字节读取时,我会反复得到最后几个字节?

nwlls2ji

nwlls2ji1#

您正在64位代码中使用int 0x80。通常,在64位代码中,您将使用syscall指令并使用其它寄存器参数。有关一些简单的阅读,请参阅What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?
我如何找出sys_readinfo 是否为零如何找出EOF???
如果请求从文件中读取特定数量的字节,报告的计数小于您请求的数量,则已到达文件结尾。如果报告的计数为0,则在您发出请求之前已到达文件结尾,否则我们称读取了部分记录。
我不知道如何使用sys_read来检查是否没有读取字节。
sys_read为您提供了在eax寄存器中实际读取的字节数。我在回答您之前的问题时已经提到了这一点。Nasm linux出于某种原因,我不能同时使用两个文件变量名来打开文件和创建文件?
当我尝试cmp时,info 是零字节读取,我得到了最后几个字节一遍又一遍???
你已经成功地创造了一个无限循环!
在NASM中,像mov r10, info这样的指令会加载寄存器中 infoaddress,而不是你想获取的存储在 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

sys_creatsys_openeax寄存器中返回给你的是一个文件描述符(它在名称 fd_infd_out 中),它是一个句柄,系统可以通过它来识别打开的文件。它是一个单双字,分配4个双字来存储它是没有意义的。
另外,我觉得奇怪的是,在回答我之前的回答时,你把info resb 26改成了info resd 26。这没有多大意义。
这一次使用64位寄存器时,您确实在 fd_in 变量上引入了另一个不匹配!如果您存储了d字(mov [fd_in], eax),则不要检索q字(mov 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:
yftpprvb

yftpprvb2#

我发现如果我检查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

相关问题