Консультация № 183347
25.05.2011, 14:22
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: помогите ,пожалуйста , написать программу, считающую количество запятых в файле. Имя файла ввести с клавиатуры или передать как параметр командной строки. Чтение из файла организовать блоком. Размер блока- по усмотрению. Желательны подробные комментарии. АСС-TASM. Заранее спасибо, с уважением Canijke.

Обсуждение

давно
Старший Модератор
31795
6196
26.05.2011, 17:54
общий
это ответ
Здравствуйте, Canijke!

Смотрите приложение.
Имя файла можно ввести как в командной строке, так и в самой программе.
вопросы задавайте в мини-форум.
Удачи!

Приложение:
model tiny
.code
org 100h
szBlock equ 256
;начало сбрасываем счетчик
begin: xor ax,ax
mov dwCount,ax
;адрес командной строки
mov si,80h
;адрес буфера
lea di,dbFileName
lodsb;длина аргументов ком строки
or al,al
jz cmd01
;копируем командную строку
xor ch,ch
mov cl,al
lodsb;пропускаем пробел
push di
rep movsb;копируем вместе с 0Dh
pop di
jmp cmd02
;вводим имя
cmd01: mov ah,09;сообщение "введите имя"
lea dx,dbEnter
int 21h
mov ax,0FFh;длина 256 символов
mov dwHndl,ax
lea dx,dwHndl;вводим имя файла
mov ah,0ah
int 21h
;ком.строка и ввод строки всегда заканчивается 0Dh
cmd02: inc di
cmp byte ptr[di],0Dh
jnz cmd02
;нам нужно для открытия файла заменить его на 0
xor ax,ax
stosb
;открываем файл
mov ah,3Dh
lea dx,dbFileName
int 21h
jnc @@01
;ошибка выводим сообщение
lea dx,dbErrorOpen
jmp MSG01
;
@@01: mov dwHndl,ax;запоминаем дискриптор
;читаем блок данных
@@02: mov ah,3Fh
mov bx,dwHndl
mov cx,szBlock
lea dx,dbBlock
int 21h
jnc @@03
;ошибка закрываем файл
mov ah,3eh
mov bx,dwHndl
int 21h
;выводим сообщение
lea dx,dbErrorLoad
MSG01: lea bx,AnyKey
push bx
jmp MSG
;в счетчик количество прочитанных символов
@@03: mov cx,ax
push ax;запоминаем их
lea si,dbBlock;настраиваемся на блок памяти
@@04: lodsb;считаем символ
cmp al,',';запятая
jnz @@05;нет переходим
inc word ptr dwCount;да увеличиваем счетчик
@@05: loop @@04;пока СХ больше нуля
pop ax;востанавливаем кол-во символов
cmp ax,szBlock;проверяем кол-во символов
jz @@02;совпало повторяем
;не совпало конец файла, закрываем его
mov ah,3Eh
mov bx,dwHndl
int 21h
;выводим сообщение "результат"
lea dx,dbResult
call MSG
;загружаем счетчик
mov ax,dwCount
xor cx,cx
mov bx,10
;в цикле остаток от деления на 10 записываем в стек
@@06: xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz @@06
;в цимклу из стека извлекаем цифры в нужной последовательности
@@07: pop ax
or al,'0'
int 29h
loop @@07
;ожидаем любую клавишу
AnyKey: xor ax,ax
int 16h
ret
;выводим сообщение адрес DX
MSG: mov ah,9
int 21h
ret
dbEnter db 10,13,'Enter file name:$'
dbResult db 10,13,'Result:$'
dbErrorOpen db 10,13,'Error open file$'
dbErrorLoad db 10,13,'Error load data$'
dwCount dw ?
dwHndl dw ?
dbFileName label byte
dbBlock db szBlock dup(?)
end begin
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа