Программа на графику - Assembler
Формулировка задачи:
Ребят, помогите пожалуйста с решением этой задачи. Не знаю от чего оттолкнуться даже.
В графическом режиме рисуется линия при нажатии кнопки и движении мышки, в случае получения замкнутой фигуры, по нажатии кнопки мышки производится заливка.
Решение задачи: «Программа на графику»
textual
Листинг программы
- org 100h
- start:
- mov ax,13h
- int 10h
- xor ax,ax
- int 33h
- mov ax,1
- int 33h
- mov ax,12
- mov cx,3
- mov dx,handler
- int 33h
- push 0A000h
- pop es
- xor ax,ax
- int 16h
- ret
- handler:
- mov ax,2
- int 33h ;выключаем курсор мыши
- shr cx,1
- push dx
- push cx ;передаём координаты курсора в качестве параметров функции line
- and bx,1
- jz @f
- cmp bl,[z] ;если нажата левая кнопка мыши копируем содержимое экрана в буфер
- jz @f
- mov [y],dx
- mov [x],cx
- mov cx,320*200/2
- push es
- push ds
- pop es
- pop ds
- mov di,buffer
- xor si,si
- rep movsw
- push es
- push ds
- pop es
- pop ds
- @@:
- mov [z],bl
- xor di,di
- mov si,buffer
- mov cx,320*200/2
- rep movsw ;копируем буфер на экран
- call line ;рисуем линию из точки (x,y) в точку, на которую указывает курсор
- mov ax,1
- int 33h ;включаем курсор мыши
- retf
- floodfill:
- line:
- push bp
- mov bp,sp
- imul di,[y],320
- add di,[x]
- mov ax,[ss:bp+4]
- sub ax,[x]
- sbb bx,bx
- mov dx,[ss:bp+6]
- sub dx,[y]
- sbb cx,cx
- mov si,ax
- or si,dx
- je quit
- xor ax,bx
- sub ax,bx
- xor dx,cx
- sub dx,cx
- or bx,1
- mov si,cx
- xor cx,320
- sub cx,si
- cmp ax,dx
- ja a
- xchg ax,dx
- xchg bx,cx
- a:
- mov si,ax
- mov bp,ax
- b:mov byte[es:di],2
- sub si,dx
- jnl next
- add si,ax
- add di,cx
- next:
- add di,bx
- dec bp
- jne b
- quit:
- mov byte[es:di],2
- pop bp
- ret 4
- x dw 160
- y dw 100
- z db 0
- buffer rb 0
Объяснение кода листинга программы
org 100h
- устанавливает начальный адрес загрузки программыstart:
- метка начала программыmov ax,13h
- помещает значение 13h в регистр axint 10h
- вызывает прерывание 10h для установки видеорежимаxor ax,ax
- очищает регистр axint 33h
- вызывает прерывание 33h для управления мышьюmov ax,1
- помещает значение 1 в регистр axint 33h
- вызывает прерывание 33h для управления мышьюmov ax,12
- помещает значение 12 в регистр axmov cx,3
- помещает значение 3 в регистр cxmov dx,handler
- помещает адрес метки handler в регистр dxint 33h
- вызывает прерывание 33h для управления мышьюpush 0A000h
- помещает значение 0A000h в стекpop es
- извлекает значение из стека и помещает в регистр esxor ax,ax
- очищает регистр axint 16h
- вызывает прерывание 16h для работы с клавиатуройret
- возврат из процедурыhandler:
- метка начала процедуры- ... (код обработки событий мыши)
x dw 160
- объявляет переменную x со значением 160y dw 100
- объявляет переменную y со значением 100z db 0
- объявляет переменную z со значением 0buffer rb 0
- объявляет массив buffer размером 0 байт
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д