 |
; ввода
;
; Входные данные: нет
;
; Выходные данные:
; AL = символ, если он был доступен
; флаг Z = 0 (NZ), если символ доступен,
; = 1 (Z) при достижении конца строки
;
; Нарушаемые регистры: AH, BX, CX, DX
;
GetNextCharacter PROC
mov ah,3fh ; функция DOS
; чтения из файла
mov bx,0 ; стандартный
; описатель ввода
mov cx,1 ; считать один символ
mov dx,OFFSET TempChar ; поместить символ
; в TempChar
int 21h ; получить следующий
; символ
jc NoCharacterRead ; если DOS сообщает
; об ошибке,
; интерпретировать ее,
; как конец файла
cmp [TempChar],1ah ; это Control-Z?
; (метка конца файла)
jne NotControlZ ; нет
NoCharacterRead:
sub ax,ax ; установить флаг Z,
and ax,ax ; что отражает, был
; ли считан символ (NZ)
; или мы достигли
; конца файла (Z).
; Обратите внимание,
; что функция DOS 3fh
; устанавливает регистр
; AX в значение числа
; считанных символов
mov al,[TempChar] ; возвратить считанный
; символ
ret ; выполнено
GetNextCharacter ENDP
;
; Подпрограмма, сообщающая, является ли прочитанный символ
; разделителем
;
; Входные данные:
; AL = проверяемому символу
;
; Выходные данные:
; флаг Z = 0 (NZ), если символ не является разделителем,
; = 1 (Z) если символ - разделитель
;
; Нарушаемые регистры: нет
;
IsCharacterWhitespace PROC
cmp al,09h ; это символ табуляции?
jz EndIsCharacterWhitespace ; если да, то
; это разделитель
cmp al,' ' ; это пробел?
jz EndIsCharacterWhitespace ; если да, то
; это разделитель
cmp al,0dh ; это возврат каретки?
jz EndIsCharacterWhitespace ; если да, то
; это разделитель
cmp al,0ah ; это перевод строки?
cmp al,' ' ; это пробел?
; если да, то это
; разделитель,
; возвратить Z, если
; нет, то это не
; разделитель, возвратить
; NZ (устанавливаться
; cmp)
EndIsCharacterWhiteSpace:
ret
IsCharacterWhiteSpace ENDP
;
; Подпрограмма, преобразующая двоичное число в текстовую
; строку
;
; Входные данные:
; AX = число, которое нужно преобразовать
; DS:BX = указатель на конец строки, в которой
; сохраняется текст
;
; Выходные данные: нет
;
; Нарушаемые регистры: AX, BX, CX, DX, SI
;
ConvertNumberToString PROC
mov si,10 ; используется в цикле
; ConvertLoop
sub dx,dx ; преобразовать AX в
; двойное слово в AD:DX
div si ; разделить число на 10
; остаток - в DX, это
; десятичное число из
; одной цифры; число/10
; находится в AX
add dl,'0' ; преобразовать остаток
; в текстовую строку
mov [bx],dl ; поместить эту цифру в
; строку
dec bx ; ссылка на следующую
; самую значащую цифру
loop ConvertLoop ; обработать следующую
; цифру, если она есть
ret
ConvertNumberToString ENDP
;
; Подпрограмма, выводящая строку на экран дисплея
;
; Входные данные:
; DS:BX = указатель на выводимую строку
;
; Выходные данные: нет
;
; Нарушаемые регистры: нет
;
PrintString PROC
push ax ; сохранение регистров
push dx ; в подпрограмме
mov ah,9 ; функция DOS вывода
; строки
mov dx,bx ; установить DS:DX на
; выводимую строку
int 21h ; вызвать DOS для
; вывода строки
pop dx ; восстановить измененные
pop ax ; регистры
ret ; возврат управления
PrintString ENDP
END ProgramStart
Выполняемый файл WCOUNT.EXE можно запускать в ответ на подс-
казку DOS, переназначив ввод из файла, в котором вы хотите подс-
читать слова. Например, для подсчета числа слов в файле
WCOUNT.ASM нужно в ответ на подсказку DOS ввести:
wcount
|