Текст программы с необходимыми комментариями
Блок-схема программы представлена в приложении 1, листинг программы в приложении 2.
В начале программы происходит описание заголовка программы и сегмента кода:
title F10BORDUR ;заголовок
CODESG SEGMENT 'CODE' ;начало сегмента кода
ASSUME CS:CODESG, DS:CODESG,SS:CODESG,ES:CODESG ;назначение адресаций регистров
ORG 100H ; устанавливаем относительный адрес для начала выполнения программы
begin:
main proc ;начало процедуры
Фрагмент программы, осуществляющий переход в текстовый режим (так же используется для очистки экрана):
mov ah,00h; функция 00hпозволяющая переключать режимы
mov al,03; 80х25 стандартный 16-цветовой текстовый режим
int 10h; вызовBIOSдля выполнения функции
Фрагмент программы, осуществляющий вывод на экран строки символов (сообщений):
MOV AH,09h ;Функция вывода на экран строки до символа $
LEA DX,MSG1 ; Команда LEA загружает адрес области NAMPRMP
; в регистр DX для передачи в DOS адреса выводимой информации.
INT 21H ; Вызов DOS
Фрагмент программы, осуществляющий вычисление размера программы и вывод на экран результата с разбиением числа на цифры и выводом этих цифр справа налево.
mov ax,(newstk-begin) ; заносим в регистрAXразность конца и начала адресов
; сегмента
GG: div ten ; делим на 10 для выделения цифры справа
mov c1,al ;цифра заносится вAL, ее перемещаем вC1 для того
;сохранить ее
add ah,t3 ; для вывода на экран цифры, а не символаASCII
; соответствующего цифре 48, так как в таблице ASCII
; цифры от 0 до 9 имеют соответственно код 48 - 57
mov c2,ah ;сохраняем «цифру» так как регистрAHбудет
; использоваться далее
MOVAH,02h ;функция установки положения курсора
MOV BH,00 ;указываем страницу 0
MOV DH,1 ; строка 1
MOVDL,i; столбец соответствует переменнойI
INT 10H ; Вызов BIOS
dec i ;уменьшениеIна единицу для сдвига курсора влево
MOV AH,40h;Функция вывода на экран
mov bx,01 ; дескриптор дисплея
mov cx,1 ; количество выводимых байт
LEA DX,c2 ; загружаем адрес строки С2 где хранится код цифры
INT 21H ; вызываемDOS
cmp c1,0 ;проверяем остались ли цифры в числе
je mainl ; если да то переходим к меткеMAINL
mov al,c1 ; возвращаем в регистр оставшееся число
xor ah,ah ; обнуляем регистрAHдля того чтобы число переместилось вAX
JMP GG ;переходим к меткеGGдля вывода следующей цифры
Основной фрагмент программы выполняющий считывание с клавиатуры без эхо-отображения вводимый символ и в случае нажатия F10 смены цвета границы экрана, Esc – выход из программы, если же будет нажата какая-нибудь другая клавиша, то вывод сообщения об ошибке и ожидание повторного ввода.
MAINl: MOV AH,07h ; Функция прямого ввода с клавиатуры без эхоотображения
INT 21H ; ВызовDOS
CMPAL,0 ; Если в регистреALпосле ввода с клавиатуры 0, то это означает
JE func; что была нажата функциональная клавиша, переходим к меткеfunc
cmp al,1bh ;Иначе, проверяем наESC– код 1BH,
je exitprog ; если да, то переходим к метке exitprog для завершения программы
mist: mov ah,00h ; в случае если была нажата другая клавиша, очищаем экран
mov al,03 ; методом перехода в текстовый режим
int 10h
; и выводим на экран сообщение MSG2
MOV AH,9h;Функция вывода на экран строки
lea dX,MSG2
INT 21H
JMPMAINl ; переходим для ожидания ввода к метке Mainl
func:INT21H;для проверки функциональной клавиши нужно повторно вызватьDOS
CMPAL,44h; Проверяем наF10, кодASCII– 44H
JEEX;если это она, то переходим к меткеEXдля смены цвета границы экрана
JMP mist ; иначе означает что была нажата какая то другая функциональная
; клавиша, переходим к метке MIST для вывода сообщения об ошибке
ex: MOV AH,0bh;Функция установки цвета
MOV BH,00 ;границы экрана
MOV BL,colorborder ; в переменной colorborder
INT 10H ;Вызвать BIOS
cmp colorborder,0fh ; Проверяем равена ли переменнаяcolorborder15
je obnul ;если да то к метке obnul
inc colorborder ; иначе инкреметируем
jmp mainl ; переходим к ожиданию ввода с клавиатуры
obnul: mov colorborder,0 ;Заносим нулевой цвет в colorborder
jmp mainl ; переходим к ожиданию ввода с клавиатуры
exitprog: ret ; Завершение программы возврат вDOS
main endp ; завершение процедуры
Фрагмент программы, осуществляющий определение данных:
MSG1 DB 'For change color of screen border press F10, for exit ESC. The program size in bytes is$'
MSG2 DB 'Wrong key is pressed, press F10. Or Esc for exit$'
colorborder db 1
c1 db 0
c2 db 0
ten db 10
i db 20
t3 db 48
newstk=$ ; newstk присваиваем адрес конца программы
CODESGENDS; конец сегмента
end begin;конец программы