Автор: Пользователь скрыл имя, 26 Сентября 2011 в 00:48, контрольная работа
Механизм шлюзов для передачи управления на сегменты кода с другими уровнями привилегий
Loop massiv2_out_loop ; идём обрабатывать следующий элемент
;*****************************
mov ah, 9 ;
lea dx, AbzacMessage ;
int 21h ; делаем "абзац"
;*****************************
_Repeat: ; метка "повтор"
mov ah, 9 ;
lea dx, RepeatMessage ; выводим сообщение о необходимости повтора
int 21h ;
GetKey_1: ; метка опроса клавиш
Mov ah, 1 ; код функции "проверка готовности"
Int 16h ; обращение к BIOS
jz GetKey_1 ; символ не введён, возвращаемся на начало
; подпрограммы
xor ah, ah ; код функции "чтение символа в AL"
int 16h ; обращение к BIOS
Cmp ah, 1Ch ; введён символ Enter?
Jne GK_1 ; нет; идём на метку
Mov Ax, 0 ; обнуляем
Mov _counter, AX ; счётчик элементов
lea BX, In_massiv ; заносим в регистр bx адрес входного массива
xor SI, SI ; SI=0
mov CX, 100 ; Счетчик повторений - 100
mov AX, 0 ; Заполнитель
nulmas: ; очистим входной массив элементов
mov [BX][SI], AX ; Очистка элемента массива
inc SI ; Сдвиг к следующему
inc SI ; слову массива
loop nulmas ; Повторить CX раз
jmp main ; прыгаем к основному циклу массива
GK_1:
Cmp al, 1Bh ; введён символ Esc ?
Jne getkey_1 ; идём на опрос ожидание ответа, если нет
int 20h ; выходим из программы
;*****************************
;**** Вывод символа, ASCII код которого находится в al **********************
;*****************************
OutSym:
push ax ; сохранение содержимого ax
push bx ; сохранение содержимого bx
mov ah, 0Eh ; ah = код функции BIOS
mov bx, 07h ; цвет переднего плана (цифр)
int 10h ; обращение к BIOS для вывода символа
pop bx ; восстановление содержимого bx
pop ax ; восстановление содержимого ax
ret ; возврат на вызывающий модуль
;*****************************
; Далее записаны выводимые на экран сообщения, и одна используемая переменная
;*****************************
StartMessage db "Программа Pro8_4_1.com. Написал Шумель Владимир, 8 вариант.", 0Dh, 0Ah, 0Ah, \
"Максимальное
количество элементов массива
- 100. Вводите элементы, разделяя их
клавишей (space). Максимальное значение
вводимого элемента - 10000. После ввода нужного
числа элементов массива нажмите (enter).
Для выхода из программы нажмите(esc).",
0Dh, 0Ah, 0Ah, 24h
MainMessage db "Введите
элементы массива:", 0Dh, 0Ah, 0Ah, 24h
Mass1Message db "Массив,
содержащий остатки от деления
на 10 элементов первого массива:", 0Dh,
0Ah, 0Ah, 24h
Mass2Message db "Массив,
содержащий произведения на 2 элементов
первого массива:", 0Dh, 0Ah, 0Ah, 24h
RepeatMessage db "Для
повторения нажмите (enter), для выхода
нажмите (esc).", 0Dh, 0Ah, 0Ah, 24h
AbzacMessage db 0Dh, 0Ah, 0Ah,
24h
In_massiv dw 100 dup (0)
_counter dw 0
_Flag db 1
CSEG ends ; метка конца программы в программном сегменте
End Begin ; метка конца
программы.
Программа Pro8_4_2.
Ввести
строку и удалить из нее все
имеющиеся цифры. Результат вывести на
экран.
Листинг
программы:
SCEG SEGMENT ; имя сегмента, в котором находится программа
org 100h ; начинается программа со смещения 100h
;*****************************
Start: ; метка начала программы
mov ah, 9 ; будем выводить строку символов
lea dx, StartMessage ; с адресом в dx
int 21h ; вызываем прерывание DOS
;*****************************
Main: ; метка начала программы
mov ah, 9 ;
lea dx, MainMessage ; выводим сообщение о введении символов
int 21h ;
M_1: ; метка основного цикла программы
Call GetKey ; вызываем подпрограмму получения символа
Cmp al, 1Bh ; сравниваем введённый символ с Esc
Je _quit ; если равен ? то идём на метку выхода
Cmp ah, 1Ch ; сравниваем скан-код клавиатуры с Enter
Je _vyvod ; если равен ? то идём на вывод массива
Call outsym ; вызываем эхоотображение символа
Cmp al, '0' ; код символа < кода нуля?
jb nodig ; да, символ не цифра, идём на запись в массив
cmp al, '9' ; код символа > кода девятки?
ja nodig ; да, символ не цифра, идём на запись в массив
jmp M_1 ; иначе идём получать очередной символ
nodig: ; метка обработки не цифр
mov SI, _counter ; записываем в регистр значение счётчика
; символов
mov out_mas[SI], al ; записываем в выходной массив по смещению в SI
inc _counter ; инкрементируем значение счётчика
jmp M_1 ; идём на получение очередного символа
_vyvod: ; метка вывода полученного массива без цифр
mov ah, 9 ;
lea dx, MasMessage ; выводим сообщение о выходном массиве
int 21h ;
Mov cx, _counter ; заносим в счётчик цикла значение счётчика
; элементов
Xor SI, SI ; обнуляем регистр SI
_vyvod_loop: ; метка начала цикла
Mov al, out_mas[SI] ; читаем в регистр al символ из массива по
; смещению в SI
Call OutSym ; вызываем отображение символа
Inc SI ; инкрементируем номер элемента
Loop _vyvod_loop ; повторяем, пока не дойдём до конца массива
;*****************************
_Repeat: ; метка "повтор"
mov ah, 9 ;
lea dx, RepeatMessage ; выводим сообщение о необходимости повтора
int 21h ;
getkey_1: ; метка
call GetKey ; вызываем подпрограмму получения символа
Cmp ah, 1Ch ; введён символ Enter?
Jne GK_1 ; нет; идём на метку
xor ax, ax ; обнуляем
Mov _counter, AX ; счётчик элементов
lea BX, Out_mas ; заносим в регистр bx адрес входного массива
xor SI, SI ; SI=0
mov CX, 1000 ; Счетчик повторений - 1000
mov AX, 0 ; Заполнитель
nulmas: ; очистим входной массив элементов
mov [BX][SI], AX ; Очистка элемента массива
inc SI ; Сдвиг к следующему байту массива
loop nulmas ; Повторить CX раз
jmp start ; прыгаем к основному циклу массива
GK_1: ; метка
Cmp al, 1Bh ; введён символ Esc ?
Jne getkey_1 ; идём на опрос ожидание ответа, если нет
int 20h ; выходим из программы
;*****************************
OutSym: ; вывод символа из al
push ax ; сохранение содержимого ax
push bx ; сохранение содержимого bx
mov ah, 0Eh ; ah = код функции BIOS
mov bx, 4fh ; цвет переднего плана (цифр)
int 10h ; обращение к BIOS для вывода символа
pop bx ; восстановление содержимого bx
pop ax ; восстановление содержимого ax
ret ; возвращаемся на вызывающий модуль
;*****************************
GetKey: ; метка подпрограммы вводва символа
Mov ah, 1 ; код функции "проверка готовности"
Int 16h ; обращение к BIOS
Jz GetKey ; символ не введён, возвращаемся на начало
Xor ah, ah ; код функции "чтение символа в AL"
Int 16h ; обращение к BIOS
Ret ; возвращаемся на вызывающий модуль
;*****************************
_quit: ; метка выхода
Int 20h ; выходим из программы
;*****************************
StartMessage db "Программа
Pro8_4_2.com. Написал Шумель Владимир, 8 вариант.",
0Dh, 0Ah, 0Ah, "Вводите символы, при наборе
нужного количества символов нажмите
Enter, для выхода из программы нажмите Esc.",
0Dh, 0Ah, 0Ah, 24h,
MainMessage db "Введите
строку:", 0Dh, 0Ah, 0Ah, 24h
MasMessage db 0Dh, 0Ah, 0Ah, "Введённая
строка, из которой удалены все цифры:",
0Dh, 0Ah, 0Ah, 24h
RepeatMessage db 0Dh, 0Ah, 0Ah,
"Для повторения нажмите (enter), для выхода
нажмите (esc).", 0Dh, 0Ah, 0Ah, 24h
Out_mas db 1000 dup (0)
_counter dw 0
SCEG ENDS ; конец сегмента
END Start ; конец программы
Задание
5. Программирование
с использованием
bios
Программа Pro8_5_1.
Построить
изображение красного окна 16х16.
Организовать вывод вводимого
текста в окно. Текст вводится
построчно. Переход на следующую
строку производится автоматически
/программой/. Цвет символов - белый,
программа должна завершать
работу при вводе "$".
Листинг
программы:
CSEG segment ; имя сегмента программы
org 100h ; начинаем её со смещения 100h
Start: ; метка начала программы
;*****************************
mov ah, 0h ;Установка видео режима
mov al, 3h ;AL = режим(текст,80x25,16/8)
int 10h ;Видео сервис
;*****************************
Black_screen: ; делаем экран чёрным (на случай, если запускали из
; командной строки)
mov ax, 0B800h ; сегмент видеопамяти
mov es, ax ; заносим в es
mov di, 0 ; положение элемента на экране ? 0, то есть верхний
; левый угол
mov al, 0 ; заносим в al символ (пусто)
mov ah, 07h ; заносим в ah атрибут символа (серый на чёрном фоне)
mov cx, 2000 ; заносим в cx число повторений (2000, весь экран)