Полная версия этой страницы:
Ассемблер
Guest_Misha
17:05:2005, 18:33
Народ как на ассемблере прочитать список папок с диска С, файлы не надо. Желательно с коментариями и подробным описанием какие системные функции и прерывания bios использовались и почему. Вся проблема в том что мне надо сделать ассемблерную вставку а я ассемблера не знаю
_dimka_
17:05:2005, 18:41
Скачай любую книгу по асму, там глянь работу с файлами.
Всё. Что за проблема.
Работать, работать и работать. Может получится программист.
Guest_Misha
23:05:2005, 12:28
Скачал я книгу и не одну но там нигде не нашел готового алгоритма, а я ассемблера не знаю, а ради того чтоб сделать вставку читать всю книгу??? Народ я больше чем уверен там прога на 10 строчек, неужели асам в ассемблере влом их чиркануть? Ну вот очень надо выручайте
mike.dld
23:05:2005, 13:38
DOS, Windows?
Guest_Misha
23:05:2005, 17:41
DOS
mike.dld
23:05:2005, 21:41
Нижеследующий код прекрасно компилируется 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
24:05:2005, 06:04
Огромное спасибо, хоть один человек выручил
Guest_Misha
24:05:2005, 07:18
А как это алгоритм будет выглядеть на masm, просто Pascal не понял FASM
mike.dld
24:05:2005, 09:47
Я не думаю, что различия в синтаксисе очень велики... На MASM'е я никогда не писал, так что если кто-нибудь и может помочь - это не я.
Цитата
А как это алгоритм будет выглядеть на masm, просто Pascal не понял FASM
$21 => 21h - числа в 16-ричной форме записываются с суффиксом
h и
0 в начале, если первая цифра-буква (тавтология

)
12h,
0Ah... Метки должны начинаться с буквы или @ (поменяй . на @)
Может ещё что-то, но это первое что бросилось в глаза.
З.Ы. Это Tasm'овские правила, т.к. AFAIK в Pascal именно правила Tasm (точнее очень схожие). Более подробно можешь прочитать в Help'е к твоему Pascal'ю.
Guest_Misha
24:05:2005, 17:00
Если я правильно понял то это будет выглядеть так, но это не компилируется
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
24:05:2005, 22: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.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.