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)画三角形等图形的实现(升级版)的更多相关文章

  1. assembly x86(nasm)画三角形等图形的实现

    参考了一位大佬的博客 https://blog.csdn.net/qq_40298054/article/details/84496944传送门 https://blog.csdn.net/qq_40 ...

  2. CSS深入了解border:利用border画三角形等图形

    三角形实际上是border的产物 我们正常使用的border都是四边一个颜色,当我们把四边换上不同颜色 那么你就会发现,三角来了~! <!DOCTYPE html> <html la ...

  3. assembly x86(nasm)修改后的日常

    data segment ENG db 'SUNdayS Coming I Wanna Drive My Car,SUN,SUN$' ;9,3 sun1 db 'SUN' swcount db 0ah ...

  4. assembly x86(nasm)子程序1

    T: 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来.要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示. 思路: Main主调程 ...

  5. assembly x86(nasm)的日常

    cs的日常打卡. data segment ENG db 'SUNdayS Coming I Wanna Drive My Car,SUN,SUN$' ;43,35 sun1 db 'SUN' swc ...

  6. assembly x86(nasm)串比较

    预留字符串口令,输入口令串与预留密码串比较.若匹配则显示“MATCH!CONGRATULATION”,否则显示“NOMATCH!”,并让用户重新输入,程序能对口令进行测试,但测试次数最多3次,若3次输 ...

  7. assembly x86(nasm)选择排序

    有一个首地址为NUM的N字无序无符号整数数组,编制程序采用选择排序法使该数组中的数按照从小到大的次序排序输出. 选择排序: data segment message db 'This is a pro ...

  8. css3画三角形的原理

    以前用过css3画过下拉菜单里文字后面的“下拉三角符号”,类似于下面这张图片文字后面三角符号的效果 下面是一个很简单的向上的三角形代码 #triangle-up { width: 0; height: ...

  9. iOS开发UI-利用Quartz2D 实现基本绘图(画三角形、矩形、圆、圆弧)

    1.画三角形  运行结果如下 1.1具体实现步骤 1.1.1首先新建一个project,然后自定义一个view 1.2代码 #import "htingShapeView.h" @ ...

随机推荐

  1. Hadoop实战-MapReduce之WordCount(五)

    环境介绍: 主服务器ip:192.168.80.128(master)  NameNode  SecondaryNameNode ResourceManager 从服务器ip:192.168.80.1 ...

  2. ElasticSearch(十一)批量CURD bulk

    1.bulk语法 POST /_bulk { "delete": { "_index": "test_index", "_type ...

  3. 虚拟化(五):vsphere高可用群集与容错(存储DRS是一种可用于将多个数据存储作为单个数据存储群集进行管理的功能)

    vsphere高级功能需要vcenter server和共享存储的支持才能实现.vsphere的高级功能有 vmotion.storage vmotion.vsphere HA.vsphere DRS ...

  4. Mac查看端口

    lsof -i tcp:port eg: lsof -i tcp:8899

  5. CORS 理解(不要那么多术语)

    摘要 谈到跨域,不论前端还是后端,多少有点谈虎色变,面试中也常会问到这些问题,浏览器和服务器端到底怎么做才能跨域,他们都做了什么? 同源 vs 跨域 同源,字面意义是相同的源头,即同一个web服务器( ...

  6. static静态数据的初始化

    package com.demo.book; public class StaticInitialization { static Table table = new Table(); static ...

  7. CentOS6.5 yum源设置

    在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度. 国内比较快的有163源.sohu源.这里以163源为例子. 1. cd /etc/yum.repos.d 2 ...

  8. hdu-5761 Rower Bo(数学)

    题目链接: Rower Bo Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/Others ...

  9. VirtualBox下安装ubuntu图文教程以及软件安装

    一. 下载安装VirtualBox 官网下载VirtualBox,目前版本:VirtualBox 5.1.8 for Windows hosts x86/amd64 下载好了安装VirtualBox, ...

  10. AQS与重入锁ReetrantLock原理

    一.AQS原理 AQS(AbstractQueuedSynchronizer)队列同步器是用来构建锁.同步组件的基础框架. AQS内部通过一个volatile int类型的成员变量state控制同步状 ...