Рисование прямоугольника - Assembler
Формулировка задачи:
Подскажите,пожалуйста,каким образом можно нарисовать прямоугольник с заданными координатами в ассемблер?
Решение задачи: «Рисование прямоугольника»
textual
Листинг программы
.model small .stack 100h .data chr db 'F' x1 dw 10 ; col y1 dw 10 ; row x2 dw 50 y2 dw 20 color db 3 .code begin: mov ax, @data mov ds, ax mov es, ax mov ah, 0 ; 0 - установить видеорежим mov al, 13h ; Видеорежим = 13h (графика, 320х200) int 10h ; Прерывание - видео сервис. mov cx, x1 ; устанавливаем координату Х (откуда будем рисовать) mov dx, y1 ; устанавливаем координату Y mov ah, 0Ch ; Номер функции установки точки ; CX - строка (Y) ; DX - столбец (Х) xor bh, bh ; видеостраница - 0 mov al, color ; устанавливаем цвет c1: int 10h ; вызываем прерывание и ставим точку cmp dx, y2 ; сравниваем со значением y2 jne lp ; если не равно - goto LP cmp cx, x2 ; если равно - сравниваем с Х2 jne lp2 ; не равно - goto lp2 jmp ex ; иначе - выходим из цикла (т.к. половину прямоугольника мы нарисовали) lp: inc dx ; увеличиваем координату jmp c1 lp2: inc cx jmp c1 ex: ; аналогичный цикл на достроение 2 части прямоугольника c2: int 10h cmp dx, y1 jne lp3 cmp cx, x1 jne lp4 jmp ex2 lp3: dec dx jmp c2 lp4: dec cx jmp c2 ex2: mov ah, 1 int 21h mov ax, 4c00h int 21h end begin
Объяснение кода листинга программы
- Определение модели памяти -
.model small - Определение размера стека -
.stack 100h - Объявление переменных:
chr db 'F'- символьная переменная chr со значением 'F'x1 dw 10- переменная x1 с размером слова (dw) и значением 10y1 dw 10- переменная y1 с размером слова (dw) и значением 10x2 dw 50- переменная x2 с размером слова (dw) и значением 50y2 dw 20- переменная y2 с размером слова (dw) и значением 20color db 3- байтовая переменная color со значением 3
- Определение сегментов кода и данных:
mov ax, @datamov ds, axmov es, ax
- Установка видеорежима:
mov ah, 0mov al, 13hint 10h
- Установка начальной координаты точки для рисования прямоугольника:
mov cx, x1mov dx, y1mov ah, 0Chxor bh, bhmov al, color
- Цикл для рисования первой половины прямоугольника:
int 10hcmp dx, y2/jne lp/cmp cx, x2/jne lp2/jmp ex/lp:/inc dx/jmp c1/lp2:/inc cx/jmp c1
- Цикл для рисования второй половины прямоугольника:
int 10hcmp dx, y1/jne lp3/cmp cx, x1/jne lp4/jmp ex2/lp3:/dec dx/jmp c2/lp4:/dec cx/jmp c2/ex2:
- Команды для завершения программы:
mov ah, 1int 21hmov ax, 4c00hint 21h