Автор: Пользователь скрыл имя, 26 Сентября 2011 в 00:48, контрольная работа
Механизм шлюзов для передачи управления на сегменты кода с другими уровнями привилегий
_BS: ; метка цикла
mov es:[di], ax ; отображаем регистр ax нарпрямую в видеобуфер
add di, 2 ; инкрементируем счётчик положения элемента
loop _BS ; повторяем на весь экран
red_screen: ; делаем красное окно размером 16*16
mov di, 704 ; заносим в регистр положения элемента верхний левый
; угол окна (при этом оно будет располагаться по центру
; экрана
mov ah, 4fh ; загружаем атрибут символа (белые символы на красном
; фоне
mov cx, 256 ; заносим в cx число повторений ? для окна 16*16
_rs: ; метка цикла
mov es:[di], ax ; отображаем регистр ax нарпрямую в видеобуфер
push ax ; сохраняем в стеке регистр ax
call _increment ; вызываем подпрограмму изменения положения курсора и
; регистра расположения символа di
pop ax ; возвращаем из стека регистр ax
loop _rS ; повторяем для всего окна
in_text: ; ввод текста
mov di, 704 ; заносим в регистр положения элемента верхний левый
; угол окна (при этом оно будет располагаться по центру
; экрана
_IT: ; метка цикла
Mov ah, 1 ; код функции "проверка готовности"
Int 16h ; обращение к BIOS
Jz _IT ; символ не введён, возвращаемся на начало подпрограммы
Xor ah, ah ; код функции "чтение символа в AL"
Int 16h ; обращение к BIOS
Cmp al, '$' ; сравнение полученного символа с "$"
Je Quit ; если это он, то выходим; иначе
Mov ah, 4fh ; загружаем в ah атрибут символа (белый на красном)
mov es:[di], ax ; отображаем символ в видеопамять
call _increment ; вызываем подпрограмму инкрементирования счётчиков
jmp _IT ; возвращаемся в бесконечный цикл
;*****************************
_increment: ; инкрементирование строк и столбцов
inc _stroka ; инкрементируем переменную строки
cmp _stroka,16 ; сравниваем с 16
je _CR ; да ? конец строки ? идём на соотв. обработку
jmp put_di ; нет ? идём сразу на изменение положения символа
_CR: ; метка перехода на новую строку
Mov _stroka, 0 ; загружаем в переменную строки 0
Inc _stolb ; инкрементируем переменную столбца
cmp _stolb,16 ; сравниваем с 16
jne put_di ; нет ? идём сразу на изменение положения символа
Mov _stolb, 0 ; да ? конец окна - загружаем в переменную столбца 0
Put_di: ; Установка значения регистра di исходя из значений ; строк и столбцов
Mov ax, 160 ; Производим вычисления по формуле:
Mul _stolb ; (160*y)+704+x+x, где
Add ax, 704 ; x ? значение переменной _stroka
Add ax, _stroka ; y ? значение переменной _stolb
Add ax, _stroka ;
Mov di, ax ; Заносим результат вычисления в регистр di
Put_d: ; Установка положения курсора исходя из значений строк и
; столбцов
Mov bx, _stroka ; Вычисляем положение курсора по горизонтали
mov ax, 32 ; по формуле x+32
Add ax, bx ; x+32
Mov dl, al ; заносим в младшую часть регистра dx
Mov bx, _stolb ; Вычисляем положение курсора по вертикали
mov ax, 4 ; по формуле
Add ax, bx ; y+4
Mov dh, al ; заносим в старшую часть регистра dx
Putpos: ; Установка позиции курсора
mov ax, 0200h ; код функции BIOS
xor bx, bx ; видео страница
int 10h ; перемещение курсора
ret ; выходим из подпрограммы
;*****************************
Quit: ; метка выхода
int 20h ; выход из программы
;*****************************
_stolb dw 0 ; переменная столбца
_stroka dw 0 ; переменная строки
CSEG ends ; конец сегмента
end Start ; конец программы.
Программа Pro8_5_2.
Построить
движущееся изображение
квадратика со стороной 3 точки.
Квадратик должен двигаться по
диагоналям при начатии
клавиш "л" и "п". Программа
должна завершать работу при начатии
клавиши F7.
CSEG segment ; имя сегмента, в котором находится программа
org 100h ; начинается программа со смещения 100h
Start: ; метка начала программы
mov ah,0h ; Установка видео режима
mov al,13h ; AL = режим (640*480, 16 цветов)
int 10h ; Видео сервис
;*****************************
painting: ; метка начала отрисовки квадратика
mov cx, startx ; загружаем стартовую позицию по горизонтали
mov dx, starty ; загружаем стартовую позицию по вертикали
painting1: ; метка цикла рисования
mov ah, 0ch ; загружаем режим видео
mov al, 4 ; загружаем цвет
int 10h ; рисуем точку
inc cx ; инкрементируем указатель x
mov ax, startx ; получаем позицию точки
add ax, 3 ; +3
cmp cx, ax ; сравниваем с полученной позицией точки
jnz painting1 ; если не равна - рисуем следующую точку
mov cx, startx ; если равна, загружаем стартовую позицию по
; горизонтали
inc dx ; инкрементируем указатель y
mov ax, starty ; получаем позицию точки
add ax, 3 ; +3
cmp dx, ax ; сравниваем с полученной позицией точки
jnz painting1 ; если не равно, продолжаем рисовать
;*****************************
; если равно, опрашиваем кнопки
main: ; метка опроса кнопок
Mov ah, 1 ; код функции "проверка готовности"
Int 16h ; обращение к BIOS
Jz main ; символ не введён, возвращаемся на метку
Xor ah, ah ; код функции "чтение символа в AL"
Int 16h ; обращение к BIOS
cmp ah, 41h ; нажата клавиша F7?
jz exit_program ; да, идём на выход из программы
cmp ah, 22h ; нажата клавиша "п"?
jz pravo_vverh ; да, идём на отработку смещения стартовой точки
cmp ah, 25h ; нажата клавиша "л"?
jz levo_vverh ; да, идём на отработку смещения стартовой точки
jmp main ; нажата другая клавиша, идём на ожидание
;*****************************
pravo_vverh: ; смещение стартовой точки право вверх
call clearing ; вызываем подпрограмму стирания квадратика
mov ax, startx ; грузим в ах стартовую позицию
inc ax ; увеличиваем на 1
cmp ax, 321 ; проверяем, не вышла ли за пределы поля
jnz pravo_vverh1 ; не вышла - прыгаем
xor ax, ax ; вышла ? обнуляем регистр ax
pravo_vverh1: ; метка
mov startx, ax ; устанавливаем стартовую точку из ах
mov ax, starty ; производим такую же операцию по вертикали
dec ax ; только проверяем, не вышла ли слева за предел
jnz pravo_vverh2 ;
mov ax, 200 ;
pravo_vverh2: ;
mov starty, ax ;
jmp painting ; прыгаем на отрисовку нового квадратика
;*****************************
levo_vverh: ; аналогично перемещаем стартовую точку
call clearing ; влево и вверх
mov ax, startx ;
dec ax ;
jnz levo_vverh1 ;
mov ax, 320 ;
levo_vverh1: ;
mov startx, ax ;
mov ax, starty ;
dec ax ;
jnz levo_vverh2 ;
mov ax, 200 ;
levo_vverh2: ;
mov starty, ax ;
jmp painting ;
;*****************************
clearing: ; метка начала стирания квадратика
mov cx, startx ; где делаем то же, что в рисовании
mov dx, starty ; только цвет будет чёрный (цвет фона)
clearing1: ;
mov ah, 0ch ;
mov al, 0 ;
int 10h ;
inc cx ;
mov ax, startx ;
add ax, 3 ;
cmp cx, ax ;
jnz clearing1 ;
mov cx, startx ;
inc dx ;
mov ax, starty ;
add ax, 3 ;
cmp dx, ax ;
jnz clearing1 ;
ret
;*****************************
exit_program: ; метка
mov ax,0003h ; восстановливаем
int 10h ; текстовый режим
int 20h ; выходим из программы
;*****************************
; переменные
startx dw 159
starty dw 99
;*****************************
CSEG ends ; метка конца сегмента
end Start ; точка входа
в программу.
Оглавление
Теоретический
вопрос………………………………………………………………
Практические
задания……………………………………………………………
Оглавление…………………………………………
Литература……………………………………
Литература