• Miércoles 20 de Noviembre de 2024, 16:33

Autor Tema:  DTA - como obtener file date, time and size?  (Leído 2931 veces)

rbaez

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
DTA - como obtener file date, time and size?
« en: Viernes 8 de Octubre de 2010, 00:00 »
0
Saludos,

he encontrado un codigo en NASM que funciona similar al comando "DIR", muestra una lista con el nombre de los archivos con la extension especificada en el directorio, pero quisiera saber como podria obtener el date, time, y size del archivo para mostrarlo tambien

el codigo es el siguiente:

org 100h

start:

mov ah, 0x1A ; Set DTA table adress
mov dx, DTA
int 21h

;call clean_name

mov ah, 0x4E
xor cx, cx ; no attributes
mov dx, squery
int 21h
jc theend ; no files matching query found

mov ah, 9
mov dx, fname
int 21h

find_next:

mov ah, 0x4F
mov dx, squery
int 21h ; find next matching file
jc theend ; no more files found

mov ah, 9
mov dx, fname
int 21h

jmp find_next


theend:

mov ah, 0x4C
int 21h


clean_name:
mov cx, 13
mov di, fname
xor ax, ax
repe stosb ; fill name with zeros incase memory has some ugly stuff or smth left from last search
ret


squery db "*.*", 0x0 ; search query, must end with zero

DTA resb 0x15 ; ignore useless DOS data
fattr db 0x0 ; file attribute
ftime dw 0x0 ; file creation/modification time
fdate dw 0x0 ; file creation/modification date
fsize dw 0x0 ; file size
fsmth dw 0x0
fname resb 14 ; file name terminated with zero
db 0xD, 0xA ; New line
db "$" ; 0xD - tells DOS to go to new line.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: DTA - como obtener file date, time and size?
« Respuesta #1 en: Viernes 8 de Octubre de 2010, 13:24 »
0
Los datos que queres estan ahi mismo, junto al nombre, en la estructura que devuelven esos dos servicios de MS-DOS.

http://www.ctyme.com/intr/rb-2977.htm
http://www.ctyme.com/intr/rb-2979.htm

Te recomiendo depurar el programa para entenderlo mejor, para hacerlo simple si agregas justo despues de llamar a FindFirstFile o FindNextFile esto:
Código: ASM
  1. mov cx, [fsize]
  2.  

Vas a tener el tamaño en el registro cx (tambien tenes ftime y fdate definidos en la estructura).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rbaez

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: DTA - como obtener file date, time and size?
« Respuesta #2 en: Viernes 8 de Octubre de 2010, 20:13 »
0
Saludos Eternal Idol,

Aprecio mucho su respuesta y de hecho la doy como buena y valida, pero ahora me enfrento al problema de que cuando intento obtener el fdate ,ftime, ó fsize...e imprimo su contenido me muestra "basura de memoria", lo ironico es que puedo accesar al fname sin problemas.


estoy deacuerdo con la estructura de la DTA:

 Estructura de la DTA Desplazamiento   Longitud   Contenido
                                               0      21           Reservado
                                              21       1           Atributos del fichero
                                              22       2           Hora de creación
                                              24       2           Fecha de creación
                                              26       4           Tamaño
                                              30      14            NOMBRE.EXT (ASCIIZ)

ahora bien me pregunto si seria un problema de compatibilidad, si esto funciona solo en algunas versiones de DOS, bueno yo estoy emulando con DOSBOX 0.74, tambien lo ejecuto en win 7 (command prompt), pero obtengo el mismo resultado, te adjunto una foto para que veas cual es el resultado final de la ejecucion...

en el codigo que estoy trabajando es el siguiente:


; p6.asm
org 100h

segment .data
squery db "*.*", 0x0 ; search query, must end with zero
   DTA resb 0x15 ; ignore useless DOS data
   fattr db 0x0 ; file attribute
   ftime dw 0x0; file creation/modification time
   fdate dw 0x0 ; file creation/modification date
   fsize dw 0x0 ; file size
   fsmth dw 0x0
   fname resb 14 ; file name terminated with zero
db 0xD, 0xA ; New line
db "$" ; 0xD - tells DOS to go to new line.

segment .text

start:
int 3h
mov ax, cs
mov ds, ax

mov ah, 0x1A ; Set DTA table adress
mov dx, DTA
int 21h

call clean_name

mov ah, 0x4E
xor cx, cx ; no attributes
mov dx, squery
int 21h
jc theend ; no files matching query found

mov cx, [fsize]
mov ah, 09h
mov dx, cx
int 21h

mov ah, 09h
mov dx, fname
int 21h


find_next:
call clean_name

mov ah, 0x4F
mov dx, squery
int 21h ; find next matching file
jc theend ; no more files found

mov ah, 9
lea dx, [DTA+30] ; print fname
int 21h

mov ah, 09h
lea dx, [DTA+26] ; expected to get fsize
int 21h

jmp find_next


theend:

mov ah, 0x4C
int 21h
ret

clean_name:
mov cx, 13
mov di, fname
xor ax, ax
repe stosb ; fill name with zeros incase memory has some ugly stuff or smth left from last search
ret
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: DTA - como obtener file date, time and size?
« Respuesta #3 en: Sábado 9 de Octubre de 2010, 02:06 »
0
¿Lo depuraste como te dije? Podes usar debug.com.

Usar ese servicio de la interrupcion 21h para escribir en consola de esa manera no es correcto, ese servicio recibe como parametro una CADENA y no valores enteros.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

rbaez

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: DTA - como obtener file date, time and size?
« Respuesta #4 en: Sábado 9 de Octubre de 2010, 18:01 »
0
Saludos,

Gracias de ante mano por todo el soporte, tengo que decir que aun persisto con el problema, he intentado depurarlo con debug.exe, a mano y todo eso, pero no encuentro la forma, realmente no se como hacerlo en NASM.

la cuestion es como accesar a esos datos (fdate, ftime, fsize...) de la manera correcta para poder mostrarlo por pantalla

alguna idea?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: DTA - como obtener file date, time and size?
« Respuesta #5 en: Domingo 10 de Octubre de 2010, 14:39 »
0
Para poder mostrarlo en pantalla tenes que transformar el numero en cadena.

Si tenes 12345 tenes que generar una cadena con los numeros ASCII correspondientes:
49,50,51,52,53

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.