assembly x86(nasm)画三角形等图形的实现(升级版)
https://www.cnblogs.com/lanclot-/p/10962702.html接上一篇
本來就有放棄的想法,可是有不愿退而求次,
然后大神室友寫了一個集海倫公式計算三角形面積,
三點(diǎn)坐標(biāo)計算的程序,
data segment
message db 'Please input 3 numbers',0dh,0ah,'$'
message1 db 'These numbers can not make up a triangle','$'
num db ?,?,?
zuobiao dw ?,?,?,?,?,?
n db ?,?,?,?
m db 'area=',?,?,?,?,?
crlf db 0dh,0ah,'$'
d dw ?,?,?,?
a db ?,?,?
data ends
stack segment para stack'stack'
db 50 dup(?)
code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov ds,ax
mov dx,offset message
mov ah,9
int 21h
mov di,0
again:mov ah,1 ;輸入3個數(shù)(ps:為了設(shè)計的方便,只能輸入3個10以內(nèi)的整數(shù))
int 21h
and al,00001111b
mov num[di],al
mov dx,offset crlf
mov ah,9
int 21h
inc di
cmp di,3
jb again
mov al,num[1] ;將輸入的數(shù)按從大到小排序
cmp al,num[2]
jb continue
mov bl,num[2]
mov num[1],bl
mov num[2],al
mov al,bl
continue:cmp al,num[0]
jnb inspect
mov bl,num[0]
mov num[0],al
mov num[1],bl
cmp bl,num[2]
jb inspect
mov al,num[2]
mov num[1],al
mov num[2],bl
inspect:mov al,num[0] ;檢查是否滿足形成三角形的條件
add al,num[1]
cmp al,num[2]
jna tip
mov al,num[2]
sub al,num[1]
cmp al,num[0]
jnb tip
jmp area
tip:mov dx,offset message1
mov ah,9
int 21h
jmp exit
;利用海倫公式求三角形面積
area:mov al,num[0] ;a+b+c=?
add al,num[1]
add al,num[2]
mov n[0],al
mov al,num[0] ;a+b-c=?
add al,num[1]
sub al,num[2]
mov n[1],al
mov al,num[0] ;a+c-b=?
add al,num[2]
sub al,num[1]
mov n[2],al
mov al,num[1] ;b+c-a=?
add al,num[2]
sub al,num[0]
mov n[3],al
mov al,n[0] ;(a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)=?
mov bl,n[1]
mul bl
mov cx,ax
mov al,n[2]
mov bl,n[3]
mul bl
mul cx
output:mov bx,16 ;上述值除以16
div bx
mov bx,ax
mov ax,dx
mov cx,625
mul cx
mov d[0],ax
mov d[2],dx
mov ax,bx
mov bx,10000
mul bx
add d[0],ax
adc d[2],dx
mov bx,0
sqrt1: inc bx ;開根號
mov ax,bx
mul bx
cmp dx,d[2]
jna sqrt1
sqrt2:dec bx
mov ax,bx
mul bx
cmp ax,d[0]
ja sqrt2
mov ax,bx
mov d[0],bx
mov bl,100
div bl
mov cl,ah
cbw
mov bl,10
div bl
or al,00110000b
mov m[6],al
or ah,00110000b
mov m[7],ah
mov m[8],'.'
mov al,cl
cbw
mov bl,10
div bl
or al,00110000b
mov m[9],al
or ah,00110000b
mov m[10],ah
mov m[11],'$'
mov dx,offset m
mov ah,9
int 21h
graph:mov ax,d[0]
mov bx,2
mul bx
mov d[0],ax
mov d[2],dx
mov al,num[2]
cbw
mov n[0],al
mov n[1],ah
mov ax,d[0]
mov dx,d[2]
mov bl,n[0]
mov bh,n[1]
div bx
mov zuobiao[10],ax
mul ax
mov d[0],ax
mov d[2],dx
mov al,num[1]
mul al
mov bx,10000
mul bx
mov d[4],ax
mov d[6],dx
mov bx,0
heng1:inc bx
mov ax,bx
mul bx
add ax,d[0]
adc dx,d[2]
cmp dx,d[6]
jna heng1
heng2:dec bx
mov ax,bx
mul bx
add ax,d[0]
adc dx,d[2]
cmp ax,d[4]
ja heng2
mov zuobiao[8],bx ;bx的值為橫坐標(biāo)
mov zuobiao[0],0
mov zuobiao[2],0
mov al,num[2]
mov bl,100
mul bl
mov zuobiao[4],ax
mov zuobiao[6],0
exit:mov ah,4ch
int 21h
code ends
end start
?
于是,
把他封裝成我的子程序fdw,
debug了許久
就成了!?!
?
?先看結(jié)果:
?
?
?
?
完整版:
data segment message db 'Please input 3 numbers(0~9)',0dh,0ah,'$' message1 db 'These numbers can not make up a triangle','$' message2 db 0dh,0ah,'Please press any key to display graphics',0dh,0ah,'$' a1 dw 3 dup(?) b1 dw 3 dup(?) num db ?,?,? n db ?,?,?,? m db 'area=',?,?,?,?,?,?,? d dw ?,?,?,? crlf db 0dh,0ah,'$' buf1 db 5db ?db 5 dup('$') x1 dw ? y1 dw ? x2 dw ? y2 dw ? s2 dw ? s1 dw ? p dw ? xd dw ? yd dw ? data ends code segment assume cs:code,ds:data ;------------------------------------------------------------------------------------------------------------------------------------------ main proc start: mov ax,datamov ds,axcall fdwmov al,12h ;320*200 256色的圖形模式:mov ah,0 ;是用來設(shè)定顯示模式的服務(wù)程序int 10hmov ax,a1[0]mov bx,b1[0]mov x1,axmov y1,bxmov ax,a1[2]mov bx,b1[2]mov x2,axmov y2,bxcall rowmov ax,a1[0]mov bx,b1[0]mov x1,axmov y1,bxmov ax,a1[4]mov bx,b1[4]mov x2,axmov y2,bxcall chosemov ax,a1[2]mov bx,b1[2]mov x1,axmov y1,bxmov ax,a1[4]mov bx,b1[4]mov x2,axmov y2,bxcall chosexor si,simov ah,4ch int 21h main endp ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ fdw procmov dx,offset messagemov ah,9int 21hmov di,0 again:mov ah,1 ;輸入3個數(shù)(ps:為了設(shè)計的方便,只能輸入3個10以內(nèi)的整數(shù))int 21hand al,00001111bmov num[di],almov dx,offset crlfmov ah,9int 21hinc dicmp di,3jb againmov al,num[1] ;將輸入的數(shù)按從大到小排序cmp al,num[2] jb continuemov bl,num[2]mov num[1],blmov num[2],almov al,bl continue:cmp al,num[0]jnb inspectmov bl,num[0]mov num[0],almov num[1],blcmp bl,num[2]jb inspectmov al,num[2]mov num[1],almov num[2],blinspect:mov al,num[0] ;檢查是否滿足形成三角形的條件add al,num[1]cmp al,num[2]jna tipmov al,num[2]sub al,num[1]cmp al,num[0]jnb tipjmp area tip:mov dx,offset message1mov ah,9int 21hjmp exitf;利用海倫公式求三角形面積 area:mov al,num[0] ;a+b+c=?add al,num[1]add al,num[2]mov n[0],almov al,num[0] ;a+b-c=?add al,num[1]sub al,num[2]mov n[1],almov al,num[0] ;a+c-b=?add al,num[2]sub al,num[1]mov n[2],almov al,num[1] ;b+c-a=?add al,num[2]sub al,num[0]mov n[3],almov al,n[0] ;(a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)=?mov bl,n[1]mul blmov cx,axmov al,n[2]mov bl,n[3]mul blmul cxoutput:mov bx,16 ;上述值除以16div bxmov bx,axmov ax,dxmov cx,625mul cxmov d[0],axmov d[2],dxmov ax,bxmov bx,10000mul bxadd d[0],axadc d[2],dxmov bx,0 sqrt1: inc bx ;開根號mov ax,bxmul bxcmp dx,d[2]jna sqrt1sqrt2:dec bxmov ax,bxmul bxcmp ax,d[0]ja sqrt2mov ax,bxmov d[0],bxmov bl,100div blmov cl,ahcbwmov bl,10div blor al,00110000bmov m[6],alor ah,00110000bmov m[7],ahmov m[8],'.'mov al,clcbwmov bl,10div blor al,00110000bmov m[9],alor ah,00110000bmov m[10],ahmov m[11],'$'mov dx,offset mmov ah,9int 21hgraph:mov ax,d[0]mov bx,2mul bxmov d[0],axmov d[2],dxmov al,num[2]cbw mov n[0],almov n[1],ahmov ax,d[0]mov dx,d[2]mov bl,n[0]mov bh,n[1]div bxmov b1[4],axmul axmov d[0],axmov d[2],dxmov al,num[1]mul almov bx,10000mul bxmov d[4],axmov d[6],dxmov bx,0 heng1:inc bxmov ax,bxmul bxadd ax,d[0]adc dx,d[2]cmp dx,d[6]jna heng1 heng2:dec bxmov ax,bxmul bxadd ax,d[0]adc dx,d[2]cmp ax,d[4]ja heng2mov a1[4],bx ;bx的值為橫坐標(biāo)mov a1[0],0mov b1[0],0mov al,num[2]mov bl,100mul blmov a1[2],axmov b1[2],0mov ax,a1[0]mov cl,2shr ax,cladd ax,20mov a1[0],axmov ax,b1[0]mov cl,2shr ax,cladd ax,80mov b1[0],axmov ax,a1[2]mov cl,2shr ax,cladd ax,20mov a1[2],axmov ax,b1[2]mov cl,2shr ax,cladd ax,80mov b1[2],axmov ax,b1[4]mov cl,2shr ax,cladd ax,80mov b1[4],axmov ax,a1[4]mov cl,2shr ax,cladd ax,20mov a1[4],ax lea dx,message2mov ah,9 int 21h mov ah,1 int 21hxor al,al ret exitf: mov ah,4ch int 21h fdw endp ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ row procmov cx,20mov bx,x2mov dx,80int 10h pheng:mov al,1100b ;淡紅色mov ah,0ch ;寫入點(diǎn)像inc cx ; cmp cx,bxint 10hjne phengret row endp ;------------------------------------------------------------------------------------------------------------------------------------------ line procmov dx,y1mov bx,y2cmp dx,bxjb nextlxchg dx,bx nextl: mov cx,x1int 10h pshu:mov al,1100b ;淡紅色mov ah,0ch ;寫入點(diǎn)像inc dx ; cmp dx,bxint 10hjne pshuret line endp;------------------------------------------------------------------------------------------------------------------------------------------ paint proccall compare1mov ax,x2mov bx,x1cmp ax,bxjae dpos1sub bx,axmov s1,-1mov xd,bxjmp d1 dpos1:sub ax,bxmov s1,1mov xd,ax d1: mov ax,y2mov bx,y1cmp ax,bxjae dpos2 ;y2>=y1sub bx,ax ;y2<y1mov s2,-1 mov yd,bxjmp d2 dpos2:sub ax,bxmov s2,1mov yd,ax d2: add ax,axmov bx,xd sub ax,bx mov p,ax ;2dy-dx mov cx,x1 mov dx,y1 pxie: mov al,1100b ;淡紅色mov ah,0ch ;寫入點(diǎn)像int 10hmov ax,pmov bx,0cmp ax,bxjge ppos ;p>=0jl pneg ;p<0 ppos: mov ax,xdmov bx,ydcmp ax,bxja ddpos1 ;xd>ydjbe ddneg1 ;xd<=yd ddpos1: ;0<k<1 或者 -1<k<0 同時 p>=0mov ax,x1 ;x=x+1mov bx,s1add ax,s1mov x1,ax mov ax,s2 ;y=y+1mov bx,y1add bx,axmov y1,bx mov ax,p ;Pn+1=Pn+2(dy-dx)mov bx,xdmov cx,ydadd bx,bxadd cx,cxsub cx,bxadd ax,cxmov p,ax jmp plot ddneg1: ;k>1 或者 k<-1 同時 p>=0mov ax,y1 ;y=y+1inc axmov y1,axmov ax,s1 ;x=x+1 或者 x=x-1mov bx,x1add bx,axmov x1,bxmov ax,p ;Pn+1=Pn+2(dx-dy)mov bx,xdmov cx,ydadd bx,bxadd cx,cxsub bx,cxadd ax,bxmov p,axjmp plot pxie1:jmp pxie pneg:mov ax,xdmov bx,ydcmp ax,bxja ddpos2 ;xd>ydjbe ddneg2 ;xd<=yd ddpos2: ;0<k<1 或者 -1<k<0 同時 p<0mov ax,x1 ;x=x+1mov bx,s1add ax,s1mov x1,axmov ax,p ;Pn+1=Pn+2dymov bx,ydadd bx,bxadd ax,bxmov p,axjmp plot ddneg2: ;k>1 或者 k<-1 同時 p<0mov ax,y1 ;y=y+1inc axmov y1,axmov ax,p ;Pn+1=Pn+2dxmov bx,xdadd bx,bxadd ax,bxmov p,axjmp plot plot:mov cx,x1 ;X坐標(biāo)mov dx,y1 ;Y坐標(biāo)cmp cx,x2 ;是否繪圖完畢jne pxie1ret paint endp ;------------------------------------------------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------------------------------------------------ compare1 procmov ax,y1mov bx,y2cmp ax,bxjna unchmov y1,bxmov y2,axmov ax,x1mov bx,x2mov x1,bxmov x2,ax unch:ret compare1 endp ;------------------------------------------------------------------------------------------------------------------------------------------ moving procmov ax,a1[si]mov bx,b1[si]mov x1,axmov y1,bxmov ax,a1[si]mov bx,b1[si]mov x1,axmov y1,bxadd si,2ret moving endp ;------------------------------------------------------------------------------------------------------------------------------------------ chose procmov ax,x1cmp ax,x2je line1mov ax,y1cmp ax,y2je row1call paintjmp exitc row1:call rowjmp exitc line1:call linejmp exitc exitc:ret chose endp ;------------------------------------------------------------------------------------------------------------------------------------------ code ends end start ;1.p=1/2(a+b+c) s=gp(p-a)(p-b)(p-c) ;2.S=1/2[(x1y2-x2y1)+(x2y3-x3y2)+(x3y1-x1y3)]?簡直了
轉(zhuǎn)載于:https://www.cnblogs.com/lanclot-/p/10967699.html
總結(jié)
以上是生活随笔為你收集整理的assembly x86(nasm)画三角形等图形的实现(升级版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 常用字符串函数
- 下一篇: Socket通信原理