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 dup(?)
b1 dw dup(?)
num db ?,?,?
n db ?,?,?,?
m db 'area=',?,?,?,?,?,?,?
d dw ?,?,?,?
crlf db 0dh,0ah,'$'
buf1 db
db ?
db 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,data
mov ds,ax
call fdw
mov al,12h ;320*200 256色的图形模式:
mov ah, ;是用来设定显示模式的服务程序
int 10h
mov ax,a1[]
mov bx,b1[]
mov x1,ax
mov y1,bx
mov ax,a1[]
mov bx,b1[]
mov x2,ax
mov y2,bx
call row
mov ax,a1[]
mov bx,b1[]
mov x1,ax
mov y1,bx
mov ax,a1[]
mov bx,b1[]
mov x2,ax
mov y2,bx
call chose
mov ax,a1[]
mov bx,b1[]
mov x1,ax
mov y1,bx
mov ax,a1[]
mov bx,b1[]
mov x2,ax
mov y2,bx
call chose
xor si,si
mov ah,4ch
int 21h
main endp
;------------------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------------------
fdw proc
mov dx,offset message
mov ah,
int 21h
mov di,
again:mov ah, ;输入3个数(ps:为了设计的方便,只能输入3个10以内的整数)
int 21h
and al,00001111b
mov num[di],al
mov dx,offset crlf
mov ah,
int 21h
inc di
cmp di,
jb again mov al,num[] ;将输入的数按从大到小排序
cmp al,num[]
jb continue
mov bl,num[]
mov num[],bl
mov num[],al
mov al,bl
continue:cmp al,num[]
jnb inspect
mov bl,num[]
mov num[],al
mov num[],bl
cmp bl,num[]
jb inspect
mov al,num[]
mov num[],al
mov num[],bl inspect:mov al,num[] ;检查是否满足形成三角形的条件
add al,num[]
cmp al,num[]
jna tip
mov al,num[]
sub al,num[]
cmp al,num[]
jnb tip
jmp area
tip:mov dx,offset message1
mov ah,
int 21h
jmp exitf
;利用海伦公式求三角形面积
area:mov al,num[] ;a+b+c=?
add al,num[]
add al,num[]
mov n[],al
mov al,num[] ;a+b-c=?
add al,num[]
sub al,num[]
mov n[],al
mov al,num[] ;a+c-b=?
add al,num[]
sub al,num[]
mov n[],al
mov al,num[] ;b+c-a=?
add al,num[]
sub al,num[]
mov n[],al
mov al,n[] ;(a+b+c)*(a+b-c)*(a+c-b)*(b+c-a)=?
mov bl,n[]
mul bl
mov cx,ax
mov al,n[]
mov bl,n[]
mul bl
mul cx output:mov bx, ;上述值除以16
div bx
mov bx,ax
mov ax,dx
mov cx,
mul cx
mov d[],ax
mov d[],dx
mov ax,bx
mov bx,
mul bx
add d[],ax
adc d[],dx mov bx,
sqrt1: inc bx ;开根号
mov ax,bx
mul bx
cmp dx,d[]
jna sqrt1
sqrt2:dec bx
mov ax,bx
mul bx
cmp ax,d[]
ja sqrt2 mov ax,bx
mov d[],bx
mov bl,
div bl
mov cl,ah
cbw
mov bl,
div bl
or al,00110000b
mov m[],al
or ah,00110000b
mov m[],ah
mov m[],'.'
mov al,cl
cbw
mov bl,
div bl
or al,00110000b
mov m[],al
or ah,00110000b
mov m[],ah
mov m[],'$' mov dx,offset m
mov ah,
int 21h graph:mov ax,d[]
mov bx,
mul bx
mov d[],ax
mov d[],dx
mov al,num[]
cbw
mov n[],al
mov n[],ah
mov ax,d[]
mov dx,d[]
mov bl,n[]
mov bh,n[]
div bx
mov b1[],ax
mul ax
mov d[],ax
mov d[],dx
mov al,num[]
mul al
mov bx,
mul bx
mov d[],ax
mov d[],dx mov bx,
heng1:inc bx
mov ax,bx
mul bx
add ax,d[]
adc dx,d[]
cmp dx,d[]
jna heng1
heng2:dec bx
mov ax,bx
mul bx
add ax,d[]
adc dx,d[]
cmp ax,d[]
ja heng2 mov a1[],bx ;bx的值为横坐标
mov a1[],
mov b1[],
mov al,num[]
mov bl,
mul bl
mov a1[],ax
mov b1[], mov ax,a1[]
mov cl,
shr ax,cl
add ax,
mov a1[],ax mov ax,b1[]
mov cl,
shr ax,cl
add ax,
mov b1[],ax mov ax,a1[]
mov cl,
shr ax,cl
add ax,
mov a1[],ax mov ax,b1[]
mov cl,
shr ax,cl
add ax,
mov b1[],ax mov ax,b1[]
mov cl,
shr ax,cl
add ax,
mov b1[],ax mov ax,a1[]
mov cl,
shr ax,cl
add ax,
mov a1[],ax
lea dx,message2
mov ah,
int 21h
mov ah,
int 21h
xor al,al
ret
exitf:
mov ah,4ch
int 21h
fdw endp
;------------------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------------------
row proc
mov cx,
mov bx,x2
mov dx,
int 10h
pheng:
mov al,1100b ;淡红色
mov ah,0ch ;写入点像
inc cx ;
cmp cx,bx
int 10h
jne pheng
ret
row endp
;------------------------------------------------------------------------------------------------------------------------------------------
line proc
mov dx,y1
mov bx,y2
cmp dx,bx
jb nextl
xchg dx,bx
nextl: mov cx,x1
int 10h
pshu:
mov al,1100b ;淡红色
mov ah,0ch ;写入点像
inc dx ;
cmp dx,bx
int 10h
jne pshu
ret
line endp ;------------------------------------------------------------------------------------------------------------------------------------------
paint proc
call compare1
mov ax,x2
mov bx,x1
cmp ax,bx
jae dpos1
sub bx,ax
mov s1,-
mov xd,bx
jmp d1
dpos1:
sub ax,bx
mov s1,
mov xd,ax
d1:
mov ax,y2
mov bx,y1
cmp ax,bx
jae dpos2 ;y2>=y1
sub bx,ax ;y2<y1
mov s2,-
mov yd,bx
jmp d2
dpos2:
sub ax,bx
mov s2,
mov yd,ax
d2:
add ax,ax
mov bx,xd
sub ax,bx
mov p,ax ;2dy-dx
mov cx,x1
mov dx,y1
pxie:
mov al,1100b ;淡红色
mov ah,0ch ;写入点像
int 10h
mov ax,p
mov bx,
cmp ax,bx
jge ppos ;p>=0
jl pneg ;p<0
ppos:
mov ax,xd
mov bx,yd
cmp ax,bx
ja ddpos1 ;xd>yd
jbe ddneg1 ;xd<=yd
ddpos1: ;0<k<1 或者 -1<k<0 同时 p>=0
mov ax,x1 ;x=x+1
mov bx,s1
add ax,s1
mov x1,ax
mov ax,s2 ;y=y+1
mov bx,y1
add bx,ax
mov y1,bx
mov ax,p ;Pn+1=Pn+2(dy-dx)
mov bx,xd
mov cx,yd
add bx,bx
add cx,cx
sub cx,bx
add ax,cx
mov p,ax
jmp plot
ddneg1: ;k>1 或者 k<-1 同时 p>=0
mov ax,y1 ;y=y+1
inc ax
mov y1,ax
mov ax,s1 ;x=x+1 或者 x=x-1
mov bx,x1
add bx,ax
mov x1,bx
mov ax,p ;Pn+1=Pn+2(dx-dy)
mov bx,xd
mov cx,yd
add bx,bx
add cx,cx
sub bx,cx
add ax,bx
mov p,ax
jmp plot
pxie1:
jmp pxie
pneg:
mov ax,xd
mov bx,yd
cmp ax,bx
ja ddpos2 ;xd>yd
jbe ddneg2 ;xd<=yd
ddpos2: ;0<k<1 或者 -1<k<0 同时 p<0
mov ax,x1 ;x=x+1
mov bx,s1
add ax,s1
mov x1,ax
mov ax,p ;Pn+1=Pn+2dy
mov bx,yd
add bx,bx
add ax,bx
mov p,ax
jmp plot
ddneg2: ;k>1 或者 k<-1 同时 p<0
mov ax,y1 ;y=y+1
inc ax
mov y1,ax
mov ax,p ;Pn+1=Pn+2dx
mov bx,xd
add bx,bx
add ax,bx
mov p,ax
jmp plot
plot:
mov cx,x1 ;X坐标
mov dx,y1 ;Y坐标
cmp cx,x2 ;是否绘图完毕
jne pxie1
ret
paint endp
;------------------------------------------------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------------------------------------------------
compare1 proc
mov ax,y1
mov bx,y2
cmp ax,bx
jna unch
mov y1,bx
mov y2,ax
mov ax,x1
mov bx,x2
mov x1,bx
mov x2,ax
unch:
ret
compare1 endp
;------------------------------------------------------------------------------------------------------------------------------------------
moving proc
mov ax,a1[si]
mov bx,b1[si]
mov x1,ax
mov y1,bx
mov ax,a1[si]
mov bx,b1[si]
mov x1,ax
mov y1,bx
add si,
ret
moving endp
;------------------------------------------------------------------------------------------------------------------------------------------
chose proc
mov ax,x1
cmp ax,x2
je line1
mov ax,y1
cmp ax,y2
je row1
call paint
jmp exitc
row1:
call row
jmp exitc
line1:
call line
jmp 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)]
简直了
assembly x86(nasm)画三角形等图形的实现(升级版)的更多相关文章
- assembly x86(nasm)画三角形等图形的实现
参考了一位大佬的博客 https://blog.csdn.net/qq_40298054/article/details/84496944传送门 https://blog.csdn.net/qq_40 ...
- CSS深入了解border:利用border画三角形等图形
三角形实际上是border的产物 我们正常使用的border都是四边一个颜色,当我们把四边换上不同颜色 那么你就会发现,三角来了~! <!DOCTYPE html> <html la ...
- assembly x86(nasm)修改后的日常
data segment ENG db 'SUNdayS Coming I Wanna Drive My Car,SUN,SUN$' ;9,3 sun1 db 'SUN' swcount db 0ah ...
- assembly x86(nasm)子程序1
T: 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来.要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示. 思路: Main主调程 ...
- assembly x86(nasm)的日常
cs的日常打卡. data segment ENG db 'SUNdayS Coming I Wanna Drive My Car,SUN,SUN$' ;43,35 sun1 db 'SUN' swc ...
- assembly x86(nasm)串比较
预留字符串口令,输入口令串与预留密码串比较.若匹配则显示“MATCH!CONGRATULATION”,否则显示“NOMATCH!”,并让用户重新输入,程序能对口令进行测试,但测试次数最多3次,若3次输 ...
- assembly x86(nasm)选择排序
有一个首地址为NUM的N字无序无符号整数数组,编制程序采用选择排序法使该数组中的数按照从小到大的次序排序输出. 选择排序: data segment message db 'This is a pro ...
- css3画三角形的原理
以前用过css3画过下拉菜单里文字后面的“下拉三角符号”,类似于下面这张图片文字后面三角符号的效果 下面是一个很简单的向上的三角形代码 #triangle-up { width: 0; height: ...
- iOS开发UI-利用Quartz2D 实现基本绘图(画三角形、矩形、圆、圆弧)
1.画三角形 运行结果如下 1.1具体实现步骤 1.1.1首先新建一个project,然后自定义一个view 1.2代码 #import "htingShapeView.h" @ ...
随机推荐
- asp.net mvc4 之Webapi之应用客户端访问服务器端
一.说明 客户端项目类型设计为:winform(winform窗体项目类型) 服务器端项目类型设计为:asp.net mvc4 webapi 在这里分为项目运行和调试两种情况讨论: 运行: 这种情况 ...
- 最简单的 IntelliJ IDEA 中使用 GitHub 进行版本控制教程(持续更新中)
一.在 IntelliJ IDEA 中新建一个项目并提交到 GitHub 1. 运行 IDEA,点击[Create New Project],在 IDEA 中新建一个项目. 2. 在选择项目类型对话框 ...
- Git简介和安装
一.什么是Git? Git是一个分布式版本控制系统,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来.如图所示: 任何一处的服务器或者个人机发生故障,都可以用其它机器的任何一个镜像出来 ...
- git (转载)
文章转载 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的 ...
- jquery DataTables表格插件的使用(网页数据表格化及分页显示)
DataTables - 非常强大的 jQuery 表格插件,可变宽页码浏览,现场过滤. 多列排序,自动探测数据类型,智能列宽,可从几乎任何数据源获取数据. 那么在Bootstrap下如何使用Data ...
- Struts2页面遍历
<s:iterator />可以遍历 数据栈里面的任何数组,集合等等 在使用这个标签的时候有三个属性值得我们关注 1. value属性:可选的属性,value属性是指一个被迭代的 ...
- Canvas HTML5
不支持的时候记得: <canvas id="stockGraph" width="150" height="150"> curr ...
- Oracle数据常用操作
将用逗号隔开字段拆分成两行: select * from mp_fs_file_info a,dm_process_upload b where instr(b.attachment,a.file_i ...
- Azkaban简介和使用
概述 为什么需要工作流调度系统 l 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等 l 各任务单元之间存在时间先后及前后依 ...
- 上传图片时压缩图片 - 前端(canvas)做法
HTML前端代码: <?php $this->layout('head'); ?> <?php $this->layout('sidebar'); ?> <m ...