NASM - The Netwide Assembler
NASM Forum => Using NASM => Topic started by: pikestar on July 28, 2011, 11:18:21 PM
-
Trying to learn assembly and I'm trying to play with files at the moment. I want to be able to see what's in a directory so I've used the getdents call to read the information. The problem I'm struggling with now is how to make use of what I've got. The entries don't seem to be fixed length and also only the file name is terminated by a 0. Also in the code below I'm reading to a 600 byte buffer but I know the directory I'm reading require more like 900. I had thought of putting it all on the stack instead of the reserved bytes but as I'm new to assembly I not sure if that would make any difference. I had imagined the eax would be set to -ve to show there was more to read but it's not! Does anybody have more experience with this system call??
section .text
global _start
_start:
;open the directory
;------------------
mov eax,5 ;system call for open
mov ebx,dir ;the file we want to open
mov ecx,0 ;read only
int 80h
;check file valid
;----------------
test eax,eax
jns read_dir
jmp exit_prog
read_dir:
mov dword[fd],eax ;move the file descripter for dir to the variable
mov eax,141 ;getdents sys_call
mov ebx,dword[fd] ;the file descripter for dir
mov ecx,dirent ;pointer to dirent struct
mov edx,600 ;buffer
int 80h
print_info:
;print what we read
;------------------
mov eax,4 ;write
mov ebx,1 ;stdio
mov ecx,dirent ;output
mov edx,600 ;length
int 80h
exit_prog:
;exit
;----
mov eax,1 ;sys call exit
int 80h
section .data
dir db '../../Downloads',0
mesg db 'reading dir',10
mesgLen equ $-mesg
errormsg db 'error',10
errorLen equ $-errormsg
section .bss
fd resd 1
dirent resb 600
-
"man 2 getdents" tells me "this is not the function you are interested in"... but I think it is. I think I've used it, but will have to "review"... I seem to recall that there's a maximum it will read, no matter how big your buffer is. I think it returns (in eax) the number of bytes read, regardless of whether there's more to read or not. When it returns zero, you're done.
I tried your code - had to change the name of the directory to open - and it seemed to "work". To "make sense" of it, you'll probably have to skip over inode, offset to next dirent, and length of this dirent, then calculate the length of the filename (or use puts() or printf() that expect a zero-terminated string... but you seem to like int 80h)...
It may be easier to use sys_readdir, although it's "obsolete".
I'll have to "review"... I'll get back to ya. If I forget, remind me!
Best,
Frank
-
A little "review" reminds me that I was having some "issues" with this code. I've got it partly sorted out (I guess), but I'm still not happy with it. I'm attaching what I've got. Paradoxically, the one named "readdir5" uses sys_getdents, the one named "ls0" uses sys_readdir. Go figure. They each have "good parts", I think. There might be one "good" file between 'em, but neither is quite there yet. I'm posting them anyway, 'cause I think there might be parts that could be helpful to you in your experiments, and I don't know when (if ever) I'll get to improving it/them...
Best,
Frank
-
A little "review" reminds me that I was having some "issues" with this code. I've got it partly sorted out (I guess), but I'm still not happy with it. I'm attaching what I've got. Paradoxically, the one named "readdir5" uses sys_getdents, the one named "ls0" uses sys_readdir. Go figure. They each have "good parts", I think. There might be one "good" file between 'em, but neither is quite there yet. I'm posting them anyway, 'cause I think there might be parts that could be helpful to you in your experiments, and I don't know when (if ever) I'll get to improving it/them...
Best,
Frank
Cheers I'll have a look through them and let you know how I get on
regard