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该信息是零字节读取时,我会反复得到最后几个字节?
2条答案
按热度按时间nwlls2ji1#
您正在64位代码中使用
int 0x80
。通常,在64位代码中,您将使用syscall
指令并使用其它寄存器参数。有关一些简单的阅读,请参阅What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?我如何找出
sys_read
或 info 是否为零如何找出EOF???如果请求从文件中读取特定数量的字节,报告的计数小于您请求的数量,则已到达文件结尾。如果报告的计数为0,则在您发出请求之前已到达文件结尾,否则我们称读取了部分记录。
我不知道如何使用
sys_read
来检查是否没有读取字节。sys_read
为您提供了在eax
寄存器中实际读取的字节数。我在回答您之前的问题时已经提到了这一点。Nasm linux出于某种原因,我不能同时使用两个文件变量名来打开文件和创建文件?当我尝试cmp时,info 是零字节读取,我得到了最后几个字节一遍又一遍???
你已经成功地创造了一个无限循环!
在NASM中,像
mov r10, info
这样的指令会加载寄存器中 info 的address,而不是你想获取的存储在 info 中的内容。由于地址不为零,代码如下:
将总是跳转并因此无限地继续循环。
sys_creat
和sys_open
在eax
寄存器中返回给你的是一个文件描述符(它在名称 fd_in 和 fd_out 中),它是一个句柄,系统可以通过它来识别打开的文件。它是一个单双字,分配4个双字来存储它是没有意义的。另外,我觉得奇怪的是,在回答我之前的回答时,你把
info resb 26
改成了info resd 26
。这没有多大意义。这一次使用64位寄存器时,您确实在 fd_in 变量上引入了另一个不匹配!如果您存储了d字(
mov [fd_in], eax
),则不要检索q字(mov rbx, [fd_in]
)yftpprvb2#
我发现如果我检查eax,如果它是零,那就是文件的结尾