Miércoles 20 de Noviembre de 2024, 16:33
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
ASM (Ensamblador)
(Moderador:
Eternal Idol
) »
DTA - como obtener file date, time and size?
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: DTA - como obtener file date, time and size? (Leído 2931 veces)
rbaez
Nuevo Miembro
Mensajes: 3
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.
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
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
mov
cx
,
[
fsize
]
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
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:
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
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:
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.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
ASM (Ensamblador)
(Moderador:
Eternal Idol
) »
DTA - como obtener file date, time and size?