Assembler - язык неограниченных возможностей


Командные параметры и переменные среды - часть 3


find_next: mov ah,4Fh ; Функция DOS 4Fh mov dx,offset DTA ; адрес нашей области DTA int 21h ; найти следующий файл, jc next_file_from_param ; если ошибка - файлы кончились call output_found ; вывести найденный файл на stdout jmp short find_next ; продолжить поиск файлов

no_more_params: mov ax,word ptr argc shl ax,1 add sp,ax ; удалить из стека 2 * argc байт ; (то есть весь список адресов ; параметров командной строки) ret ; конец программы

; процедура show_usage ; выводит информацию о программе

show_usage: mov ah,9 ; Функция DOS 09h mov dx,offset usage int 21h ; вывести строку на экран ret ; выход из процедуры

; процедура output_found ; выводит в stdout файл, имя которого находится в области DTA

output_found: mov dx,offset DTA+1Eh ; адрес ASCIZ-строки с именем файла mov ax,3D00h ; Функция DOS 3Dh int 21h ; открыть файл (al = 0 - только на чтение), jc skip_file ; если ошибка - не трогать этот файл mov bx,ax ; идентификатор файла - в ВХ mov di,1 ; DI будет хранить идентификатор STDOUT

do_output: mov cx,1024 ; размер блока для чтения файла mov dx,offset DTA+45 ; буфер для чтения/записи располагается ; за концом DTA mov ah,3Fh ; Функция DOS 3Fh int 21h ; прочитать 1024 из файла, jc file_done ; если ошибка - закрыть файл mov cx,ax ; число реально прочитанных байт в СХ, jcxz file_done ; если это не ноль - закрыть файл mov ah,40h ; Функция DOS 40h xchg bx,di ; BX = 1 - устройство STDOUT int 21h ; вывод прочитанного числа байт в STDOUT xchg di,bx ; вернуть идентификатор файла в ВХ, jc file_done ; если ошибка - закрыть файл jmp short do_output ; продолжить вывод файла

file_done: mov ah,3Eh ; Функция DOS 3Eh int 21h ; закрыть файл

skip_file: ret ; конец процедуры output_found

usage db "cat.com v1.0",0Dh,0Ah db "объединяет и выводит файлы на stdout",0Dh,0Ah db "использование: cat имя_файла, ...",0Dh,0Ah db "(имя файла может содержать маски * и ?)",0Dh,0Ah,'$' argc dw 0 ; число параметров (должен быть 0 при старте программы!)

DTA: ; область DTA начинается сразу за концом файла, ; а сразу за областью DTA начинается ; 1024-байтный буфер для чтения файла end start

Размер блока для чтения файла можно значительно увеличить, но в этом случае почти наверняка потребуется проследить за объемом памяти, доступным для программы.





Начало  Назад