Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ассемблер
Форум программистов > Системное программирование > Другие
Guest_Misha
Народ как на ассемблере прочитать список папок с диска С, файлы не надо. Желательно с коментариями и подробным описанием какие системные функции и прерывания bios использовались и почему. Вся проблема в том что мне надо сделать ассемблерную вставку а я ассемблера не знаю
_dimka_
Скачай любую книгу по асму, там глянь работу с файлами.
Всё. Что за проблема.

Работать, работать и работать. Может получится программист. biggrin.gif
Guest_Misha
Скачал я книгу и не одну но там нигде не нашел готового алгоритма, а я ассемблера не знаю, а ради того чтоб сделать вставку читать всю книгу??? Народ я больше чем уверен там прога на 10 строчек, неужели асам в ассемблере влом их чиркануть? Ну вот очень надо выручайте
mike.dld
DOS, Windows?
Guest_Misha
DOS
mike.dld
Нижеследующий код прекрасно компилируется FASM'ом (http://flatassembler.net) и должен работать под MS-DOS 2.0+
format MZ

FILE_SETDTA    = $1A
FILE_FINDFIRST = $4E
FILE_FINDNEXT  = $4F

       push    cs
       pop     ds

       mov     ah,FILE_SETDTA
       mov     dx,dta
       int     $21

       mov     ax,FILE_FINDFIRST shl 8 + 0
       mov     cx,00110111b; folder attributes
       mov     dx,s_anyfile
       int     $21
       jc      .done

 .next_file:
       test    byte[dta+$15],00010000b
       jz      .findnext
       mov     ah,9
       mov     dword[dta+$1E+13],$240A0D
       mov     dx,dta+$1E
       int     $21

 .findnext:
       mov     ah,FILE_FINDNEXT
       int     $21
       jnc     .next_file

 .done:
       mov     ax,$4C00
       int     $21

 s_anyfile db 'c:\*.*',0
 dta:      rw $80
Guest_Misha
Огромное спасибо, хоть один человек выручил
Guest_Misha
А как это алгоритм будет выглядеть на masm, просто Pascal не понял FASM
mike.dld
Я не думаю, что различия в синтаксисе очень велики... На MASM'е я никогда не писал, так что если кто-нибудь и может помочь - это не я.
????
Цитата
А как это алгоритм будет выглядеть на masm, просто Pascal не понял FASM

$21 => 21h - числа в 16-ричной форме записываются с суффиксом h и 0 в начале, если первая цифра-буква (тавтология smile.gif ) 12h, 0Ah... Метки должны начинаться с буквы или @ (поменяй . на @)

Может ещё что-то, но это первое что бросилось в глаза.

З.Ы. Это Tasm'овские правила, т.к. AFAIK в Pascal именно правила Tasm (точнее очень схожие). Более подробно можешь прочитать в Help'е к твоему Pascal'ю.
Guest_Misha
Если я правильно понял то это будет выглядеть так, но это не компилируется

FILE_SETDTA = 1Ah
FILE_FINDFIRST = 4Eh
FILE_FINDNEXT = 4Fh

push cs
pop ds

mov ah,FILE_SETDTA
mov dx,dta
int 21h

mov ax,FILE_FINDFIRST shl 8 + 0
mov cx,00110111b; folder attributes
mov dx,s_anyfile
int 21h
jc @done

@next_file:
test byte[dta+$15],00010000b
jz @findnext
mov ah,9
mov dword[dta+$1E+13],$240A0D
mov dx,dta+$1E
int 21h

@findnext:
mov ah,FILE_FINDNEXT
int 21h
jnc @next_file

@done:
mov ax,4C00h
int 21h

s_anyfile db 'c:\*.*',0
mike.dld
var
 dta: packed record
   search_attributes: byte;
   drive_letter: char;
   search_template: array[0..10] of char;

   entry_count_within_directory: word;
   pointer_to_dta{???}: pointer;
   parent_dir_first_cluister: word;

   file_attribute: byte;
   file_time: word;
   file_date: word;
   file_size: longint;
   file_name: array[0..12] of char;

   reserved: array[0..84] of byte;
 end;

const
 FILE_SETDTA    = $1A;
 FILE_FINDFIRST = $4E;
 FILE_FINDNEXT  = $4F;
 s_anyfile: PChar = 'c:\*.*'#0;

label
 next_file,findnext,done;

begin
 asm
       push    ds
       mov     ax,seg dta
       mov     ds,ax
       mov     ah,FILE_SETDTA
       lea     dx,dta
       int     $21

       mov     ax,FILE_FINDFIRST shl 8 + 0
       mov     cx,00110111b { folder attributes }
       lea     dx,s_anyfile+4 { first 4 bytes = string length }
       int     $21
       jc      done
 end;
next_file:
 asm
       test    byte[dta+$15],00010000b
       jz      findnext
 end;
       writeln(dta.file_name);
findnext:
 asm
       mov     ah,FILE_FINDNEXT
       int     $21
       jnc     next_file
 end;
done:
end.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.