Ввести строку с клавиатуры, посчитать количества всех десятичных цифр во введенной строке, посчитанные значения вывести на терминал.
Текст программы:
model SMALL
stack 100h
dataseg
AskCont db 0Ah,0Dh
db 'Завершить работу - Esc, продолжить - ЛЮБАЯ ÊËÀÂÈØÀ'
db '$'
Ask db 0Ah,0Dh,'Введите строку:','$'
COUNT db 10 dup(?); счетчики количества цифр
CIFR db '0123456789ABCDEF'; таблица преобразования
; шестн.цифр для вывода
INPSTR db 80,?, 82 dup(?); буфер ввода
OUTSTR db 0Dh,0Ah,?, ' ',?,?, '$'; буфер вывода
codeseg
startupcode
BEGIN:
;Ввод строки
lea DX, Ask
mov AH, 09h
int 21h
lea DX, INPSTR
mov AH, 0Ah
int 21h
;Обработка
xor AX, AX
lea BX, INPSTR+2;адрес начала введенной строки
xor CX, CX
mov CL, INPSTR+1;кол-во введенных символов строки
BB:
mov AL, [BX];очередной символ строки
cmp AL, '0';код символа меньше, чем код нуля?
jb NC;да, т.е. не цифра
cmp AL, '9';код символа больше, чем код девятки?
ja NC;да, т.е. не цифра
;символ - десятичная цифра
sub AL, '0';получаем дв. значение цифры, т.е.
mov SI, AX; индекс в массиве счетчиков COUNT
inc COUNT[SI];увеличиваем соответств. счетчик
NC: inc BX;получить очередной символ строки
|
|
loop BB
;Вывод результатов
lea DX, OUTSTR
xor SI, SI;Счетчик цифр
OO: xor AX, AX
mov AL, '0'
add AX, SI;ASCII-код очередной цифры в SI
mov OUTSTR+2, AL; в буфер вывода
mov AL, COUNT[SI];AL<-значение счетчика
; очередной цифры
mov CL, 4;получаем
shr AL, CL; в DI
mov DI, AX; значение старшей шестн. цифры
mov AL, CIFR[DI]; счетчика преобразуем в ASCII-код
mov OUTSTR+4, AL;пересылаем в буфер вывода
mov AL, COUNT[SI];AL<-знач. счетчика очередн. цифры
and AL, 0Fh;Получаем в DI значение
mov DI, AX; младшей шестн. цифры счетчика
mov AL, CIFR[DI]; преобразуем ASCII-код
mov OUTSTR+5, AL; пересылаем в буфер вывода
mov AH, 09h;Вывод сформированной в буфере
int 21h; строки
inc SI;Счетчик очередной цифры
cmp SI, 10
jl OO
;Запрос на продолжение работы
lea DX, AskCont
mov AH, 09h
int 21h
mov AH, 08h
int 21h
cmp AL, 27
je QUIT
jmp BEGIN
;Конец работы
QUIT: exitcode 0
end
ВАРИАНТЫ ЗАДАНИЙ
1. Ввести с клавиатуры строку. Сжать строку, т.е. удалить пробелы и табуляции. Вывести результаты на экран.
2. Ввести с клавиатуры строку. Преобразовать все малые буквы в большие. Вывести результаты на экран.
3. Ввести с клавиатуры строку. Посчитать количество слов в строке. Подумать, что является разделителем слов. Вывести результаты на экран.
4. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку – шаблон. Найти шаблон во введенной строке. Вывести на экран "ДА", если шаблон есть, и "НЕТ", если его нет.
5. Ввести с клавиатуры две строки. Сравнить их. Вывести на экран номер позиции, в которой строки различаются.
6. Ввести с клавиатуры строку. Если она длиннее некоторой величины, то обрезать, если короче – растянуть, вставив нужное число пробелов между словами. Вывести результаты на экран.
|
|
7. Ввести с клавиатуры строку, состоящую из нескольких слов. Вывести каждое слово на экран в отдельной строке, т.е. выдать слова в столбик.
8. Ввести с клавиатуры строку. Переставить в ней символы, поменяв местами первый с последним, второй с предпоследним и т.д. Вывести результаты на экран.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что такое программное прерывание?
2. Какие возможности работы с клавиатурой имеются у программиста?
3. Чем отличаются друг от друга различные функции DOS, выполняющие ввод с клавиатуры?
4. Что такое расширенный код клавиатуры?
5. Можно ли выдать на экран текст «$1.00 = 25.00 rub.», используя функцию DOS 09h?
6. Какие режимы адресации удобно использовать при работе с одномерными массивами?
7. Что означают выражения в поле операндов в строках примера:
lea BX, INSTR+2
mov OUTSTR+3, AL?
8. Как выделить младшую тетраду байта?
9. Как выделить старшую тетраду байта?
10. В чем отличие команд
lea BX, STR
mov BX, offset STR?
Лабораторная работа |
ÄÅÑßÒÈ×ÍÀß ÀÐÈÔÌÅÒÈÊÀ |