+ -
当前位置:首页 → 问答吧 → 求救!!!汇编语言绘制三角形代码错误,请大侠指正

求救!!!汇编语言绘制三角形代码错误,请大侠指正

时间:2011-06-27

来源:互联网

hah macro
  mov dl,0dh
  mov ah,2
  int 21h
  mov dl,0ah
  mov ah,2
  int 21h
  endm 
.model small
.386
.data
  x1 db ?
  y1 db ?
  x2 db ?
  y2 db ?
  x3 db ?
  y3 db ?
  msg0 db 'pleasa input the location of X1:$'
  msg1 db 'pleasa input the location of Y1:$'
  msg2 db 'pleasa input the location of X2:$'
  msg3 db 'pleasa input the location of Y2:$'
  msg4 db 'pleasa input the location of X3:$'
  msg5 db 'pleasa input the location of Y3:$'
  msg6 db 'do you want to quit?(y/n)$'
  err2 db 'enter location that must be less than 181$'
  err1 db 'please input again:$'
  deltax db 50 dup(?)
  deltay db 50 dup(?);此处输入堆栈段代码

   

.code

start:
  MOV AX,@data
  MOV DS,AX
  mov ss,ax
  xor ax,ax
   
   
  call hong 
  lea dx,msg6
  mov ah,01h
int 21h
cmp al,'y'
jz exit
exit: mov ah,00
  int 21h

hong proc near
; set video mode  
  mov ax, 3 ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3) 
  int 10h ; do it!  
h1:  
  lea dx,msg0 
  mov ah,9 
  int 21h 
  mov cx,0 
  mov si,0  
inputx1:  
; get char from keyboard into al 
  mov AH, 00h 
  int 16h  
; print it: 
  mov AH, 0Eh 
  int 10h 
  mov ah,0 
  push ax 
  inc cx 
  cmp al,0dh 
  jz d
  cmp al,30h 
 
  jb less 
  cmp al,39h 
  ja larger 
  jbe ente 
less: hah
  lea dx,err1 
  mov ah,9
  int 21h 
  hah
  jmp h1
larger: hah
  lea dx,err1 
  lea dx,err1 
  mov ah,9
  int 21h 
  hah
  jmp h1  
ente:  
  cmp al,0dh 
  jne inputx1  
  cmp cx,2 
  je dwx11 
  cmp cx,3 
  je dwx12 
  cmp cx,4 
  je dwx13 
  ja error 
dwx11: 
  pop bx 
  pop bx 
  sub bx,30h  
  jmp xx  
dwx12:  
  mov bx,0 
  pop ax 
  pop bx 
  sub bx,30h  
  pop ax 
  sub ax,30h  
  mov cl,10 
  mul cl 
  add bx,ax 
  jmp xx  
dwx13: 
  pop ax 
  mov bx,0 
  pop bx 
  sub bx,30h  
  mov ax,0 
  pop ax 
  sub ax,30h  
 
  mov cl,10 
  mul cl 
  add bx,ax  
  mov ax,0 
  pop ax  
  sub ax,30h  
  mov cl,100 
  mul cl 
  add bx,ax  
  cmp bx,180 
  ja error 
  jmp xx  
dx1:  
  cmp bl,180 
  ja error 
  mov x1,bl 
  jmp inputy1  
dy1: 
  mov y1,bl 
  jmp inputx2  
dx2:  
  cmp bl,180 
  ja error 
  mov x2,bl 
  jmp inputy2  
dy2:  
  mov y2,bl 
  jmp inputx3  
dx3:  
  cmp bl,180 
  ja error 
  mov x3,bl 
  jmp inputy3  
dy3: 
  mov y3,bl 
  jmp code2  
inputy1:hah 
  lea dx,msg1 
  mov ah,9 
  int 21h 
  mov cx,0  
  jmp inputx1  
inputx2:hah 
  lea dx,msg2 
 
  mov ah,9 
  int 21h 
  mov cx,0  
  jmp inputx1  
inputy2:hah 
  lea dx,msg3 
  mov ah,9 
  int 21h 
  mov cx,0  
  jmp inputx1  
inputx3:hah
  lea dx,msg4 
  mov ah,9 
  int 21h 
  mov cx,0  
  jmp inputx1 
inputy3:hah 
  lea dx,msg5 
  mov ah,9 
  int 21h 
  mov cx,0  
  jmp inputx1  
xx: 
  cmp si,1 
  je dx1 
  cmp si,2 
  je dy1 
  cmp si,3 
  je dx2 
  cmp si,4 
  je dy2 
  cmp si,5 
  je dx3 
  cmp si,6 
  je dy3 
  ja error 
  jmp code2
error:  
  mov dx,offset err2 
  mov ah,9 
  int 21h 
  hah
  jmp h1
 
d: inc si 
 
  jmp ente  
 
; set video mode 13h - 320x200 

code2: mov ax,0 
  mov bx,0 
  mov cx,0 
  mov dx,0 
  mov si,0 
  mov di,0  
  mov ax,0700h 
  mov ds,ax  
  mov ah, 0 
  mov al, 12h  
  int 10h 
  
; solute the deltax 
  mov ax,0 
  mov al,x1 
  sub al,x2 
  mov si,offset deltax 
  mov [si],al 
;if deltax = 0,jump to draw a straight line  
  cmp al,0 
  je straightline1  
 
; solute the deltay  
  mov bx,0 
  mov bl,y1 
  sub bl,y2 
  mov di,offset deltay 
  mov [di],bl  
  cmp al,bl 
  jae way11 
  jb way12 
   
way11: ;if deltay<deltax,then y=(y1-y2)*(x-x2)/(x1-x2)+y2 
; if x1>y1,draw the first line: 
  pop ax ;clear stack 
  mov ax,0 ;clear ax 
  mov cl, x1 ; row  
  mov dl, y1 ; column 
  call dlm ;call draw line mode 
  cmp cl, x2 
  jae u11 
 
  jb u12 
line11:  
  mov bx,cx 
  sub bl,x2 
  mov al,bl 
  imul byte ptr [di] 
  idiv byte ptr [si] 
  add al,y2 
  mov dl,al  
  call dlm ;call draw line mode 
  cmp cl,x2 
  jbe u12 
u11: dec cx 
  cmp cl,x2 
  jae line11 
  jb line20 
u12: inc cx 
  cmp cl,x2 
  jbe line11 
  ja line20 
  
; if x1<y1,draw the first line:  
way12: ;if deltay>deltax,then x=(x1-x2)*(y-y2)/(y1-y2)+x2 
  pop ax ;clear stack 
  mov ax,0 ;clear ax 
  mov cl, x1 ;column 
  mov dl, y1 ;row  
  call dlm ;call draw line mode 
  cmp dl, y2 
  jae v11 
  jb v12 
line12: mov ax,0 
  mov bx,dx 
  sub bl,y2 
  mov al,bl 
  imul byte ptr [si] 
  idiv byte ptr [di] 
  add al,x2 
  mov cl,al 
  call dlm ;call draw line mode 
  cmp dl,y2 
  jbe v12 
v11: dec dx 
  cmp dl,y2 
 
  jae line12 
  jb line20 
v12:  
  inc dx 
  cmp dl,y2 
  jbe line12 
  ja line20 
straightline1: 
  mov ax,0 
  mov al,y1 
  cmp al,y2 
  jae sl11 
  jb sl12 
   
sl11: mov dl, y1 ;draw straight line 
x11: call dlm ;call draw line mode 
  mov cl, x1 
  dec dx 
  cmp dl, y2 
  jae x11 
  jmp line20  
   
sl12: mov dl, y1 
x12: call dlm ;call draw line mode 
  mov cl, x1 
  inc dx 
  cmp dl, y2 
  jbe x12 
  jmp line20  
line20: mov al,x3
  xchg al,x2
  mov al,y3
  xchg al,y2
  jmp code2

hong endp
dlm proc near
  mov al, 15 ; white 
  mov ah, 0ch ; put pixel 
  int 10h 
   
  ret 
 dlm endp

end start

作者: hongweinanr9   发布时间: 2011-06-27

动态输入三个坐标点没有问题,无法绘出三角形。急用啊~~周五就交啦!!!

作者: hongweinanr9   发布时间: 2011-06-27

热门下载

更多