2015-11-10 5 views
1

Я работаю со сборкой для школьного проекта, и мои рекомендации в нескольких словах требуют поиска файлов, соответствующих указанному расширению (* .txt, * .exe и т. Д.) И распечатывать размер файла, дату, имя файла и т. д. До сих пор мне удалось успешно найти файлы и настроить DTA. Все в порядке, когда дело доходит до имени файла, но я боюсь, когда мне приходится печатать размер или дату. Я предполагаю, что они в двоичном порядке? Как я могу их декодировать из двоичного в неподходящий формат?Атрибуты, размер, имя и т. Д. ASSAMBLY DTA

 ;This is my DTA start---------------------------------- 
     DTA     db 15h dup (0) 
     fatt     db 0 <------------- 
     ftime     db 0,0 <------------ how do I decode these???? 
     fdate     db 0,0 <------------- 
     fsize    db 4 dup (0) <----------- 
     fname    db 13 dup (0) 
     ;DTA end----------------------------------------- 

Это мой код, но он грязный и работа продолжается.

.model small 
    .stack 100h 

    .data 



    ;This DTA start---------------------------------- 
    DTA     db 15h dup (0) 
    fatt    db 0 
    ftime    db 0,0 
    fdate    db 0,0 
    fsize    db 4 dup (0) 
    fname    db 13 dup (0) 
    ;DTA end----------------------------------------- 

    extension  db 12 dup (0) 
    sourceFHandle dw ? 


    testas   db "C:\ATI\",0 

    directory db 64 dup (0) 

    writefile  db "C:\menulis.txt",0 
    writehandle dw ? 

    buffer db 20 dup (?) 
    simbolis db ? 



    .code 

START: 
mov ax, @data 
mov es, ax   ; es kad galetume naudot stosb funkcija: Store AL at address ES:(E)DI 

mov si, 81h    ; programos paleidimo parametrai rasomi segmente es pradedant 129 (arba 81h) baitu   

call skip_spaces 

_2: 

;; extension nuskaitymas 
lea di, extension 
call read_filename  ; perkelti is parametro i eilute 
cmp byte ptr es:[extension], '$' ; jei nieko nenuskaite 
jne _3 
_3: 

;; directory nusk 
lea di, directory 
call read_filename  ; perkelti is parametro i eilute 

push ds 
push si 

mov ax, @data 
mov ds, ax 

;nustatom DTA 
mov ah,1ah 
mov dx, offset DTA 
int 21h 

;; rasymui sukuria faila 
mov dx, offset writefile ; ikelti i dx destF - failo pavadinima 
mov ah, 3ch   ; isvalo/sukuria faila - komandos kodas 
xor cx,cx   ; normal - no attributes 
int 21h   ; INT 21h/AH= 3Ch - create or truncate file. 

       ; Jei nebus isvalytas - tai perrasines senaji, 
       ; t.y. jei pries tai buves failas ilgesnis - like   
       ; CF set on error AX = error code. 
; atidaro faila 
mov dx,offset writefile 
mov al,2 
mov ah,3dh 
int 21h 

mov writehandle,ax    





;keicia direktorija 
mov ah,3bh 
mov dx,offset directory 
int 21h 

;iesko failo  
mov ah,4eh 
mov cx,0 
lea dx,extension 
int 21h 

call write_to_file 
;raso i faila duomenis 
; lea dx,fname 
; mov bx,writehandle 
; mov ah,40h 
; mov cx, 13 

;int 21h 

find_next: 
mov ah,4fh 
lea dx,extension 
int 21h 

call write_to_file 

;uzdaryti faila 
mov ah,3eh 
mov bx,writehandle 
int 21h 


mov ah,9h 
mov dx,offset directory 
int 21h 

mov ah, 4ch 
mov al, 0 
int 21h 



;; procedures 

skip_spaces PROC near 

skip_spaces_loop: 
cmp byte ptr ds:[si], ' ' 
jne skip_spaces_end 
inc si 
jmp skip_spaces_loop 
skip_spaces_end: 
ret 

skip_spaces ENDP 

read_filename PROC near 

push ax 
call skip_spaces 
read_filename_start: 
cmp byte ptr ds:[si], 13 ; jei nera parametru 
je read_filename_end ; tai taip, tai baigtas failo vedimas 
cmp byte ptr ds:[si], ' ' ; jei tarpas 
jne read_filename_next ; tai praleisti visus tarpus, ir sokti prie kito  
read_filename_end: 
mov al, 0   ; irasyti 0 gale 
stosb       ; Store AL at address ES:(E)DI, di = di + 1 
pop ax 
ret 
read_filename_next: 
lodsb    ; uzkrauna kita simboli 
stosb       ; Store AL at address ES:(E)DI, di = di + 1 
jmp read_filename_start 

read_filename ENDP 

write_to_file PROC near 

lea dx,fname 
mov bx,writehandle 
mov ah,40h 
mov cx,13 

int 21h 
ret 
write_to_file ENDP 

end START 

ответ

0

Я забыл. Похоже, все остальные тоже. Насколько я помню, размер - это всего лишь 32-битное число. Вы должны уметь находить некоторый номер в текстовой процедуре, которая сделает это. Время и дата немного странные. Позвольте мне посмотреть, что я могу найти ...

; es:di points to text buffer 
mov ax, [date] 
and ax, 1E0h ; month 
shr ax, 5 
call show_2_dec 
mov al, '/' 
stosb 
mov ax, [date] ; again 
and ax, 1Fh ; day 
call show_2_dec 
mov al, '/' 
stosb 
mov ax, [date] ; again 
and ax, 0FE00h ; year 
shr ax, 9 
add ax, 50h ; Y2K problem? 
call show_2_dec 
mov al, 0 ; or '$' - terminator 
stosb 
; and print it 
; new buffer in es:di? 
mov ax, [time] 
and ax, 0F800h ; hours 
shr ax, 0Bh 
call show_2_dec 
mov al, ':' 
stosb 
mov ax, [time] 
and ax, 7E0h ; minutes 
shr ax, 5 
call show_2_dec 
mov al, ':' 
stosb 
mov ax, [time] 
and ax, 1Fh ; seconds/2 
shl ax, 1 ; seconds 
call show_2_dec 
; terminate and print 
; 
show_2_dec: 
aam 
xchg al, ah 
or ax, 3030h 
stosb 
mov al, ah 
stosb 
ret 

Это синтаксис Nasm (не должен вас беспокоить), и не совсем так, как я это сделал, поэтому, вероятно, есть ошибки копирования, но, если повезет, вы укажете справа направление (?)

+0

Это «добавить топор, 50 часов; Проблема Y2K? 'Не отображает правильный год! Поскольку можно с уверенностью предположить, что год будет после 2000 года, лучше всего вычесть 20 из этого 7-битного года. –

+0

Почему бы не упростить код 'stosb'' mov al, ah'' stosb' до одного 'stosw'? Также ANDING для обоих верхних полей (год и час) является избыточным, так как следующий SHIFTING RIGHT даст нулевые нули. –

+0

спасибо! это действительно привело меня на правильный путь – Aivaras