Программа на графику - 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 байт
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д