我有以下代码。除了限制其在其他程序中使用的一件事之外,它可以正常工作。当我在调试器中运行它时,Linux read系统调用返回的值总是大于指定的缓冲区大小。它为什么以及如何修复它,因为它不会让程序循环缓冲区数组而没有分段错误?
SECTION .data
address dd "log.txt", 0
badf dd "Bad file!",0
buffsize dd 1024
size dd 1024
filedesc dd 0
section .bss
buf resb 1024
SECTION .text
global main
main:
mov ebx, address
mov eax, 5 ; open(
mov ecx, 0 ; read-only mode
int 80h ; );
mov [filedesc], eax
read_loop:
mov ebx, [filedesc] ; file_descriptor,
mov eax, 3 ; read(
mov ecx, buf ; *buf,
mov edx, buffsize ; *bufsize
int 80h ; );
test eax, eax
jz done
js badfile
mov eax, 4 ; write(
mov ebx, 1 ; STDOUT,
mov edx, buffsize
mov ecx, buf ; *buf
int 80h
jmp read_loop
badfile:
mov eax, 4 ; write(
mov ebx, 1 ; STDOUT,
mov edx, 10
mov ecx, badf ; *buf
int 80h
done:
mov eax, 6
mov ebx, [filedesc]
int 0x80
mov ebx,0
mov eax,1
int 0x80
答案 0 :(得分:2)
mov edx, buffsize ; *bufsize
错误,因为buffsize
声明如下:
buffsize dd 1024
上述代码会将buffsize
的地址移至edx
。你想要的是:
mov edx, [buffsize]
会将buffsize
中存储的值移至edx
。
那里有一些类型的错误。
答案 1 :(得分:1)
可能是否定错误返回代码?
我的代码中没有看到负值的任何测试。