我设法构建了一个用于处理文件的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 ; );
答案 0 :(得分:1)
例如,在中间循环的下面的代码中,EBX总是设置为0,它应该包含文件字节。
你是如何确定的? (也许在调试器下运行?)
你的代码有一个不幸的错误:
; read the file
mov eax, 3 ; read(
mov ebx, eax ; file_descriptor,
你将EAX(包含open
系统调用返回的文件描述符,如果open
成功)覆盖值为3,在它作为文件描述符参数移到EBX之前覆盖read
。
通常,进程将以分配给stdin
,stdout
和stderr
的文件描述符0,1和2以及您明确{{1}的第一个文件描述符开始。将是3,所以你会逃脱它!
但如果您使用调试器运行,那么您可能不会那么幸运。文件描述符3可能是其他内容,open
可能会失败(您不检查返回的值是否为错误的错误代码),或者读取完全意外的内容...