Ассемблер

  • Автор темы Guest_Misha
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest_Misha

#1
Народ как на ассемблере прочитать список папок с диска С, файлы не надо. Желательно с коментариями и подробным описанием какие системные функции и прерывания bios использовались и почему. Вся проблема в том что мне надо сделать ассемблерную вставку а я ассемблера не знаю
 
D

_dimka_

#2
Скачай любую книгу по асму, там глянь работу с файлами.
Всё. Что за проблема.

Работать, работать и работать. Может получится программист. :)
 
G

Guest_Misha

#3
Скачал я книгу и не одну но там нигде не нашел готового алгоритма, а я ассемблера не знаю, а ради того чтоб сделать вставку читать всю книгу??? Народ я больше чем уверен там прога на 10 строчек, неужели асам в ассемблере влом их чиркануть? Ну вот очень надо выручайте
 
M

mike.dld

#6
Нижеследующий код прекрасно компилируется 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
 
G

Guest_Misha

#7
Огромное спасибо, хоть один человек выручил
 
G

Guest_Misha

#8
А как это алгоритм будет выглядеть на masm, просто Pascal не понял FASM
 
M

mike.dld

#9
Я не думаю, что различия в синтаксисе очень велики... На MASM'е я никогда не писал, так что если кто-нибудь и может помочь - это не я.
 
?
#10
А как это алгоритм будет выглядеть на masm, просто Pascal не понял FASM
$21 => 21h - числа в 16-ричной форме записываются с суффиксом h и 0 в начале, если первая цифра-буква (тавтология :D ) 12h, 0Ah... Метки должны начинаться с буквы или @ (поменяй . на @)

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

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

Guest_Misha

#11
Если я правильно понял то это будет выглядеть так, но это не компилируется

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
 
M

mike.dld

#12
Код:
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.
 
Статус
Закрыто для дальнейших ответов.