Программа на графику - 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

Объяснение кода листинга программы

  1. org 100h - устанавливает начальный адрес загрузки программы
  2. start: - метка начала программы
  3. mov ax,13h - помещает значение 13h в регистр ax
  4. int 10h - вызывает прерывание 10h для установки видеорежима
  5. xor ax,ax - очищает регистр ax
  6. int 33h - вызывает прерывание 33h для управления мышью
  7. mov ax,1 - помещает значение 1 в регистр ax
  8. int 33h - вызывает прерывание 33h для управления мышью
  9. mov ax,12 - помещает значение 12 в регистр ax
  10. mov cx,3 - помещает значение 3 в регистр cx
  11. mov dx,handler - помещает адрес метки handler в регистр dx
  12. int 33h - вызывает прерывание 33h для управления мышью
  13. push 0A000h - помещает значение 0A000h в стек
  14. pop es - извлекает значение из стека и помещает в регистр es
  15. xor ax,ax - очищает регистр ax
  16. int 16h - вызывает прерывание 16h для работы с клавиатурой
  17. ret - возврат из процедуры
  18. handler: - метка начала процедуры
  19. ... (код обработки событий мыши)
  20. x dw 160 - объявляет переменную x со значением 160
  21. y dw 100 - объявляет переменную y со значением 100
  22. z db 0 - объявляет переменную z со значением 0
  23. buffer rb 0 - объявляет массив buffer размером 0 байт

Оцени полезность:

8   голосов , оценка 4 из 5