提问人:NanoNebulas 提问时间:7/25/2022 最后编辑:Sep RolandNanoNebulas 更新时间:7/27/2022 访问量:124
nasm linux x64 如何找到和 cmp EOF 停止将数据从文件打印到屏幕
nasm linux x64 how do i find and cmp EOF to stop printing data from file to screen
问:
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 该信息读取为零字节时,我一遍又一遍地获得最后几个字节???
答:
我发现如果我检查 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
评论
jle eof
-4095 .. -1
read
ssize_t
0x7ffff000
)
您正在 64 位代码中使用。通常,在 64 位代码中,您将使用该指令并使用其他寄存器参数。有关一些简单的阅读,请参阅如果在 64 位代码中使用 32 位 int 0x80 Linux ABI 会发生什么?int 0x80
syscall
如何确定 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_in 和 fd_out 中),它是系统可以识别打开的文件的句柄。它是一个 dword,分配 4 个 dword 来存储是没有意义的。sys_creat
sys_open
eax
另外,我觉得很奇怪,作为对我之前答案的回应,你变成了.这没有多大意义。info resb 26
info resd 26
这次使用 64 位寄存器时,您确实在 fd_in 变量上引入了另一个不匹配!如果您存储了 d字 (),则不要检索 q字 (mov [fd_in], eax
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:
评论