assembly x86(nasm)画三角形等图形的实现(升级版)
https://www.cnblogs.com/lanclot-/p/10962702.html接上一篇
本来就有放弃的想法,可是有不愿退而求次,
然后大神室友写了一个集海伦公式计算三角形面积,
三点坐标计算的程序,
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个数(ps:为了设计的方便,只能输入3个10以内的整数)
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] ;将输入的数按从大到小排序
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的值为横坐标
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了许久
就成了!?!
先看结果:
完整版:
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 ;是用来设定显示模式的服务程序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个数(ps:为了设计的方便,只能输入3个10以内的整数)int 21hand al,00001111bmov num[di],almov dx,offset crlfmov ah,9int 21hinc dicmp di,3jb againmov al,num[1] ;将输入的数按从大到小排序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的值为横坐标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 ;写入点像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 ;写入点像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 ;写入点像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坐标mov dx,y1 ;Y坐标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)]
简直了
转载于:https://www.cnblogs.com/lanclot-/p/10967699.html
assembly x86(nasm)画三角形等图形的实现(升级版)相关推荐
- assembly x86(nasm)串比较
预留字符串口令,输入口令串与预留密码串比较.若匹配则显示"MATCH!CONGRATULATION",否则显示"NOMATCH!",并让用户重新输入,程序能对口 ...
- splitpane如何设置竖条的宽度_如何用 CSS 画三角形和箭头
三角形和箭头这两个图标在网页中经常会用到,例如:下拉选择框.排序.返回到上一页.导航条,分页都会用到三角形或者箭头,当然是用图片的方式的确可以实现这一样式,但是是用图片如果调整颜色那就比较困难了,除非 ...
- 前端怎么画三角形_css如何画三角形?
我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的.下面本篇文章就来给大家介绍一下使用css如何画三角形的方法,希望 ...
- css画直角三角形,关于CSS画三角形的那些事
用CSS画一个三角形,是不难的问题,但我却掌握的不够熟练,例如当要求为画一个直角三角形或者等腰三角形,我就有点反应不过来.所以,在这篇中点透它,以后再见,不含糊. 原理分析 用CSS画三角形,实际上就 ...
- h5画三角形_如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...
我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的,本章给大家介绍如何利用css或html画出一个三角形?两种不同的 ...
- 百度前端笔试题 css3画三角形
昨天做了百度2015年前端研发笔试卷,总体感受是比较看重html和css功底,对JavaScript的考察反而更少一些,貌似阿里也是比较看重css这一块.其中有一道用css实现的布局问题,是在一个大矩 ...
- vue3.0 + typescript openlayers实现地图标点、移动、画线、显示范围、测量长度、测量面积、画三角形、画正方形、画圆、线选、画笔、清除测量、清除、地图上展示弹窗等功能
vue3.0 + typescript openlayers实现地图标点.移动.画线.显示范围.测量长度.测量面积.画三角形.画正方形.画圆.线选.画笔.清除测量.清除地图所有等功能 由于最近项目中用 ...
- 这样画三角形的内心很方便,数学老师必会技能!
中学时代,接触的数学分为代数和几何两个分支,学习几何的时候会认识到好多几何图形,也会学习这些图形的特征和性质.比如在三角形中,三个内角的三条角平分线相交于一点,这个点叫做三角形的内心.这个点也是这个三 ...
- 计算机图形学 画三角形、圆等(入门代码)
[要求] 实现自己的三角形线框显示算法,能够将三角形的各个顶点经过坐标变换后变换到屏幕坐标,并以连线的方式将三角形的各个边显示出来.要求连线不使用Windows API,而是利用自己的2D Line算 ...
最新文章
- Nature子刊:古菌基因组的标准化物种分类方法
- 神竜出击 合三为一!
- isAlive()方法的作用
- Codeforces 947E Perpetual Subtraction (线性代数、矩阵对角化、DP)
- JAVA类的继承、覆写和final关键字
- Bootstrap框架学习
- 四旋翼双环PID控制
- java下载上传远程文件
- OpenGL+VS2012环境搭建
- C++基础——用C++实例理解UML类图
- 20140608 科技脉搏 -下半身需求是人类共同需求,有多少人就有多大市场
- EF 操作数据库中的表
- 初学者怎么自学python编程_编程零基础初学者应当如何开始学习 Python?
- 基于stm32及sim800c sim868 实现的远程控制 小程序控制模块 源码 移植过程简介
- php使用ffmpeg将音乐wav格式转为mp3格式
- 接入翼支付的php,翼支付-天翼账号开放平台
- Complex Multiplier IP 使用教程(源码)
- Training!!!
- 博士在读,在家无法科研的你,在忙些什么?
- 文本生成任务常见评估指标
热门文章
- 【CodeForces】576 C. Points on Plane
- FastReport使用
- 增长黑盒:零代码基础做智能电商网站,不要重复发明轮子
- 500 OOPS:cannot change directory:/root 问题
- 多种分布式文件系统简介
- python IDE- IDLE
- 研发过程管理导图-第一稿(转)
- Android 3.0 r1中文API文档(104) —— ViewTreeObserver
- 步入DevExpress的使用(VS)
- 第二步 (仅供参考) sencha touch + PhoneGap(cordova 2.9 及其以下版本) 使用 adt eclipse进行打包...