gpt4 book ai didi

linux - 文件读取缓冲区在 nasm 中为空

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:21 25 4
gpt4 key购买 nike

我设法构建了一个用于处理文件的 NASM 教程代码。它将文件的内容输出到 stdout 就好了,但是当我尝试访问数据缓冲区时,它只包含零。例如,在下面的代码中,在中间循环中 EBX 始终设置为 0,而它应该包含文件字节。

section .data
bufsize dw 1024

section .bss
buf resb 1024


section .text ; declaring our .text segment
global _start ; telling where program execution should start

_start: ; this is where code starts getting exec'ed

; get the filename in ebx
pop ebx ; argc
pop ebx ; argv[0]
pop ebx ; the first real arg, a filename

; open the file
mov eax, 5 ; open(
mov ecx, 0 ; read-only mode
int 80h ; );

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

mov ecx, 20
loop:
mov eax, 20
sub eax, ecx
mov ebx, [buf+eax*4]
loop loop

; write to STDOUT
mov eax, 4 ; write(
mov ebx, 1 ; STDOUT,
mov ecx, buf ; *buf
int 80h ; );

; exit
mov eax, 1 ; exit(
mov ebx, 0 ; 0
int 80h ; );

最佳答案

For example in the code below in middle loop EBX is always set to 0, when it should contain file bytes.

您如何确定这一点? (也许在调试器下运行?)

您的代码有一个不幸的错误:

 ; read the file
mov eax, 3 ; read(
mov ebx, eax ; file_descriptor,

在将 EAX 移动到 EBX 之前,您正在用值 3 覆盖 EAX(它包含 open 系统调用返回的文件描述符,如果 open 成功)作为 read 的文件描述符参数。

通常情况下,一个进程将以文件描述符 0、1 和 2 分配给 stdinstdoutstderr 开始,而第一个您显式打开 的文件描述符将为 3,因此您可以摆脱它!

但如果您使用调试器运行,您可能就没那么幸运了。文件描述符 3 可能是其他内容,read 可能会失败(您不检查返回值是否为负错误代码),或者读取完全意外的内容...

关于linux - 文件读取缓冲区在 nasm 中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7692797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com