java 实现 指派_TAP任务指派问题的汇编实现

近六周的课程设计,编了一个四百行的汇编程序,编的过程很不顺利,遇到种种意想不到的困难,但最终能够实现,可谓欣喜若狂,这期间学到了好多好多,遇到问题怎么精下心来解决,同时对汇编的理解也更加深刻了。所谓TAP任务指派问题,简单来说我实现的是有六个人,有六项任务,没个人做每一项任务的所消耗的时间代价不同,有一个六阶参考矩阵代价表,然后将六个员工编号为123456,固定不变,接下来随机产生几种任务的排序方案,假设任务命名为ABCDEF,可能随机产生一种方案为EDCABF,这意思就是第一个人做E任务,第二个人做D任务依次下去,最后计算每一种方案的总代价,然后计算每一种方案的带价总和,然和输出最优(代价值最小)的那一种方案。

运行结果图:

1355845873_8570.JPG

附源码:

DATAS SEGMENT

str1 db 'reference array:','$'

str2 db 'feasible plans:','$'

str3 db 'How many plans do you want:(1-6) ','$'

str4 db 'The optimal plan:','$'

str5 db 'The order of the employees:',0dh,0ah,'123456','$'

str6 db 'The value of these several kinds of schemes:','$'

str7 db 'The cost of this plan is:','$'

array db 5,6,9,7,4,6,8,3,5,4,6,7,6,2,4,7,8,9,9,7,6,8,4,5,7,4,3,6,8,9,5,7,8,9,6,4

peo db 1,2,3,4,5,6

StrEnter db 0dh,0ah,'$'  ;回车换行

n dw 1   ;用于显示数组为矩阵计数

temp db 2

sii dw ?

q db 0    ;用在计算代价值的子函数中

save db 0 ;用于保存al的值

best db 0  ;保存最优代价值

chushu db 6   ;用于显示数组为矩阵作为除数

count dw 0  ;产生随机串计数用的

buf db 96 dup(?)  ;最多保存八种方案

buff db 36 dup(?)  ;提取buf中有用的数字

yy  db 8 dup(?)   ;保存六种方案的代价值

OUTp db 0h     ;作为为调用显示函数保存的临时变量

countr db 0    ;作为临时的和值保存

num db 1    ;记录最小的数是第几个

DATAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:

MOV AX,DATAS

MOV DS,AX

;此处输入代码段代码

;显示“参考数组:”

lea dx,str1

mov ah,9

int 21h

;显示回车换行

call CRLF        ;调用子程序

;**********************显示参考矩阵********************************************

push si

lea si,array

mov cx,36   ;cx是loop的参考值

j1:

mov dl,[si]

add dl,30h

mov ah,2    ;调用2号中断,显示单个值

int 21h

mov ax,n

div chushu

cmp ah,0

jnz tz

call CRLF

tz:

inc n

inc si

loop j1

pop si

call CRLF;调用一次回车换行

;*****************显示员工排列的顺序******************************************

lea dx,str5

mov ah,9

int 21h

call CRLF

;*****************显示“你要选择多少种方案:(1-8)”*************************

;----显示提示语---------------------------------------------------------------

lea dx,str3

mov ah,9

int 21h

call CRLF

;----输入选择-----------------------------------------------------------------

j2: mov ah,7

int 21h

cmp al,'6'

ja j2

cmp al,'1'

jb j2

mov dl,al

mov ah,2

int 21h

mov save,al   ;因为下面si:步骤会更改al的值

call CRLF

;*****************显示“feasible plans:”**************************************

s1: lea dx,str2

mov ah,9

int 21h

call CRLF

;************************产生随机方案********************************************

mov al,save

sub al,30h  ;减去30h变成数字

mov ah,0

lea di,buf  ;取buf首地址

mov cx,ax

C0:

call Random

loop C0

lea dx,buf

mov ah,9

int 21h

call CRLF

;****************显示“这几种解决方案的代价值:”*******************************

lea dx,str6

mov ah,9

int 21h

;********************计算每一种解决方案的值***************************************

call CALCU       ;可能将save的值改变了

call CRLF

;*****************显示“最优的那个方案以及其代价值”****************************

call CRLF

lea dx,str4

mov ah,9

int 21h

;******************计算得到最优的那个方案**************************************

call CRLF

;lea dx,Str7   ;显示这最小方案的代价

;mov ah,9

;int 21h

lea si,yy

call CALBEST

;*******************************************************************************

call over  ;调用结束程序

;*******************************************************************************

;######################调用的子程序#############################################

;****回车换行*******************************************************************

CRLF PROC NEAR

lea dx,StrEnter

mov ah,9

int 21h

RET

CRLF ENDP

;****结束程序*******************************************************************

OVER PROC NEAR

MOV AH,4CH

INT 21H

RET

OVER ENDP

;******产生随机方案******************************************************************

;入口为 di,将di后的六位填充六个随机数

Random proc near

push cx

push si

mov sii,di

mov cx,6

L3:

push cx

L0:

xor ax,ax

out 43h,al

in al,40h

cmp al,1

jb L0

cmp al,6

ja L0

or al,40h

mov si,sii

mov [di],al

mov ax,di

cmp ax,si

jz L2

sub ax,si

mov cx,ax

L1:

mov ah,[si]

cmp ah,[di]

jz L0

inc si

loop L1

L2:

pop cx

inc di

loop L3

mov [di],0dh

inc di

mov [di],0ah

inc di

mov [di],'$'

pop si

pop cx

ret

Random endp

;****计算代价值*****************************************************************

;入口:peo db 6       buf db 96    array(参考数组) db   save db (保存几个方案)

;出口:res dw 8(保存所有方案的代价值)

CALCU PROC NEAR       ;g97

push si

push di    ;<<

push bp

call CRLF

call CONVERTBUFTOBUFF  ;将buf中的有用数据存到buff中

lea si,yy   ;保存六种方案的代价值

mov q,0    ;大循环的判断条件    db

f0:;将指针指向缓冲区的头部

lea di,buff

mov ah,0      ;控制到buff中的第几个方案的头地址

mov al,q

mul chushu    ;乘以6

add di,ax     ;fla标记是将si和di指向两个头指针

mov ax,0

mov ch,0   ;小循环的判断条件

fl:

inc ax

push ax     ;>>

dec ax

mul chushu     ;(x-1)*6+y       (chushu=6)

mov bl,[di]

mov bh,0

add ax,bx   ;计算要参考代价表的第几个值存在ax中

lea bp,array    ;参考代价表

dec ax       ;自减一下,因为没从0开始

add bp,ax

mov dl,[bp]    ;取参考表的值到dl

mov dh,0

add countr,dl   ;和值不断增加

inc di

pop ax

inc ch

cmp ch,chushu   ;判断是否循环了六次

JNE fl

mov dl,countr  ;把一种方案的六次的值放到dl中然后赋给

mov [si],dl    ;将计算的结果压到yy

mov dl,[si]

mov OUTp,dl

call OUTPut

inc si;*;

mov countr,0   ;和重新清0,重新计算下一个方案的结果值

;mov dl,[si]

;mov OUTp,dl;<

;call OUTPut     ;输出显示

inc q

mov al,q

cmp al,save    ;比较大循环和save的值 看看是否结束

JNE f0

pop bp

pop di

pop si

RET

CALCU ENDP

;***计算最小的那个代价值*******************************************************

;入口 res dw 8

;出口 best dw

CALBEST PROC NEAR

push si

mov bl,1      ;记录最小的这个代价值是yy中的第几个

mov cl,save      ;控制循环几次

dec cl

mov ch,0

;mov dx,cx   ;验证save是否正确

;add dx,30h

;mov ah,2

;int 21h

;;;;;;;;;;验证压入YY的值是否正确;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov dl,[si]

mov best,dl

cmp cx,0 ;如果save等于0,则不要比较直接跳转结束

jz q3

inc si

q1:

mov dl,[si]

;add dx,30h

;mov ah,2

;int 21h

inc bl    ;记录是数组中的第几个,以便输出那个方案

cmp dl,best

jnb q2     ;大于或等于则跳转到q2

mov best,dl

mov num,bl

q2:

inc si    ;si加一是字节,如果保存的是dw类型的就要加2

loop q1

;此时已经计算好了dl和最小的值,接下来时显示

q3:

mov dl,num   ;第几个方案最小

add dl,30h

mov ah,2

int 21h

call CRLF

;依次输出这六个方案

;mov dl,num

;add dl,30h

;mov ah,2

;int 21h

mov dl,num

push di

lea di,buff

mov dh,0

dec dl

mov al,dl

mov ah,0

mul chushu

add di,ax

;显示最优方案的六个字母

mov cx,6

q10:

mov dl,[di]

add dl,40h

mov ah,2

int 21h

inc di

loop q10

pop di

call CRLF

;显示这最小方案的代价的提示语

lea dx,Str7

mov ah,9

int 21h

mov dl,best   ;显示最小方案的代价值

mov OUTp,dl

call OUTPut

pop si

RET

CALBEST ENDP

;*****将buf中的值去掉回车换行存到buff***********************************************************

CONVERTBUFTOBUFF PROC NEAR

push si

sub save,30h

mov al,save

mov ah,0

mov bl,6

mul bl      ;控制多少次循环

mov cx,ax

mov bx,0

lea si,buf

lea di,buff

q4: mov dl,[si]

sub dl,40h

mov [di],dl

inc si

inc di

inc bx

cmp bx,6

JNE q5

add si,2

mov bx,0

q5: loop q4

pop si

RET

CONVERTBUFTOBUFF ENDP

;******将一个字节型的OUTp输出显示**********************************************

OUTPut proc       ;字节型的OUTp两位数的和

push si

lea si,temp

mov al,OUTp

mov cx,1

mov bl,10

CX1:

cmp al,10

jb  CX2    ;小于跳转

sub ah,ah  ;清0

div bl

mov [si],ah  ;余数赋给

inc si

inc cx

sub ah,ah   ;余数部分清0

jmp CX1

CX2:

mov [si],al  ;商赋给

CX3:

mov dl,[si]  ;商显示

add dl,30h

mov ah,2

int 21h

dec si      ;自减1,然后显示余数

loop CX3;   ;循环两次 将商和余数显示出来

mov dl,' '

int 21h

pop si

RET

OUTput endp

;******************************************************************************

CODES ENDS

END START

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 5.0正式发布,有什么功能特性(翻译)

我们很高兴今天.NET5.0正式发布。这是一个重要的版本—其中也包括了C# 9和F# 5大量新特性和优秀的改进。微软和其他公司的团队已经在生产和性能测试环境中开始使用了。这些团队向我们反馈的结果比较令人满意&#xff0c;它证明了对性能提升及降低Web应用托管成本的机会有积极的…

Java 重写 多态性_java多态性重写overriding和重载overloading的区别

一、概述就Java而言&#xff0c;当有人问&#xff1a;什么是多态&#xff1f;将重载或重写的区别解释为一个可以接受的答案&#xff1f;如果您有一个抽象基类&#xff0c;它定义了一个没有实现的方法&#xff0c;并且您在子类中定义了该方法&#xff0c;那该方法是否仍然覆盖&a…

简单聊聊C#中lock关键字

为了避免多个线程同时操作同一资源&#xff0c;引起数据错误&#xff0c;通常我们会将这个资源加上锁&#xff0c;这样在同一时间只能有一个线程操作资源。在C#中我们使用lock关键字来锁定资源&#xff0c;那lock关键字是如何实现锁定的呢&#xff1f;我们先看一段代码&#xf…

idea如何导入java工程_Eclipse java web项目 ,导入IntelliJ IDEA 完整操作!

或许你用惯了Eclipse&#xff0c;有点排斥其他工具了&#xff0c;你写框架的时候&#xff0c;编译速度是不是特别慢啊&#xff1f;有时候还超过45秒&#xff0c;自动取消运行&#xff01;有时候代码是正常的&#xff0c;却无端端报错&#xff1f;下午吃个饭回来又好了&#xff…

行业思考 | 互联网对传统行业的降维打击

【行业思考】| 作者 / Edison Zhou这是EdisonTalk的第301篇原创内容在周一发布的推文《我在传统行业做数字化转型之预告篇》中&#xff0c;我提到互联网的发展和和竞争对传统行业起到了降维打击的作用&#xff0c;于是就有童鞋私下问我&#xff0c;为何这么说。今天就跟你聊聊这…

java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...

尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。1. 使用FileStreams复制这是最经典的方式将一个文件的内…

BCVP开发者说第一期:Destiny.Core.Flow

沉静岁月&#xff0c;淡忘流年1项目简介Destiny.Core.FlowDestiny.Core.Flow是基于.NetCore平台&#xff0c;轻量级的模块化开发框架&#xff0c;Admin管理应用框架&#xff0c;旨在提升团队的快速开发输出能力&#xff0c;由常用公共操作类&#xff08;工具类、帮助类&#xf…

.NET Core 取消令牌:CancellationToken

在 .NET 开发中&#xff0c;CancellationToken&#xff08;取消令牌&#xff09;是一项比较重要的功能&#xff0c;掌握并合理的使用 CancellationToken 可以提升服务的性能。特别在异步编程中&#xff0c;我常常会以创建 Task 的方式利用多线程执行一些耗时或非核心业务逻辑&a…

java char short区别_java 彻底理解 byte char short int float long double

遇到过很多关于 数值类型范围的问题了&#xff0c;在这做一个总结&#xff0c;我们可以从多方面理解不同数值类型的所能表示的数值范围在这里我们只谈论 java中的数值类型首先说byte&#xff1a;这段是摘自jdk中 Byte.java中的源代码从这里可以看出 byte的取值范围&#xff1a;…

程序员过关斩将--从未停止过的系统架构设计步伐

“首先&#xff0c;这篇文章肯定会得罪一些人“其次&#xff0c;此文只代表我个人的意见&#xff0c;仅供参考从分层说起谈到系统架构的分层和系统领域边界的划分&#xff0c;每个架构师&#xff0c;每个技术经理&#xff0c;甚至每个程序员都有自己的一套想法。无论是怎么样的…

java流上传文档把磁盘撑满_BOOT目录磁盘占用满处理

背景&#xff1a;Ubuntu:16.04查看已安装启动镜像dpkg --get-selections |grep linux-image这里会列出目前已经安装的启动镜像&#xff0c;一般分两种&#xff0c;一种状态为“install”&#xff0c;一种为“deinstall”对于"deinstall"的镜像&#xff0c;一般为镜像…

C# 9.0 正式发布了(C# 9.0 on the record)

翻译自 Mads Torgersen 2020年11月10日的博文《C# 9.0 on the record》 [1]&#xff0c;Mads Torgersen 是微软 C# 语言的首席设计师&#xff0c;也是微软 .NET 团队的项目群经理。C# 9.0 正式发布正式宣布&#xff1a;C# 9.0 发布了&#xff01;早在5月&#xff0c;我就写了一…

磁带最优存储问题java实现_磁带的最优存储问题(贪心选择)

算法设计n个程序的平均读取时间&#xff1a;(贪心策略)在该题目中&#xff0c;要考虑综合因素&#xff1a;长度和读取概率。要求n个程序的平均读取时间最短。按照贪心策略&#xff0c;则每个程序的读取时间都应该最短。故&#xff1a;(1)计算每个程序的长度和读取概率的乘积。(…

BCVP第2期:项目已完成升级.NET5.0

(是时候拿出来这种图了)1开心的锣鼓想必这两天最热闹的几个词语&#xff0c;就是c#9.0、.net5.0还有conf大会了吧&#xff0c;当然还有大一统。其实&#xff0c;早在2019年年中&#xff0c;就已经引入了.NET5.0了&#xff0c;然后从2020-03-16开始&#xff0c;就一直在说.NET5.…

java 1..0 openjdk_java-1.7.0-openjdk-i386和java-7-openjdk-i386有什么区别

两个OpenJDK是一样的.但是OpenJDK与Oracle JDK略有不同.阅读this post了解更多信息.您为OpenJDK获取两个选项的原因是PROBABLY,您有两个安装的OpenJDK副本(或两个不同的引用到系统上的同一目录).为了进一步调查,请尝试使用ls -lh /usr/lib / jvm. /usr/lib / jvm通常是Java安装…

linux java升级版本_为嵌入式Linux设备实现更新/升级系统

我有一个在嵌入式Linux设备上运行的应用程序&#xff0c;并且偶尔会对软件进行更改&#xff0c;有时也会对根文件系统甚至已安装的内核进行更改 .在当前的更新系统中&#xff0c;只删除旧应用程序目录的内容&#xff0c;并在其上复制新文件 . 当对根文件系统进行更改时&#xf…

如何在ASP.NetCore增加文件上传大小

关注架构师高级俱乐部开启架构之路不定期福利发放哦~架构师高级俱乐部读完需要7分钟速读仅需 3 分钟/ 如何在核心中增加文件 ASP.NET 大小 /从ASP.NET 2.0开始最大请求正文大小限制为30MB &#xff08;28.6 MiB&#xff09;。在正常情况下&#xff0c;无需增加 HTTP 请求 body …

java完全二叉树最小堆_Java实现最小堆一

Java实现最小堆一堆是一种经过排序的完全二叉树&#xff0c;其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。最大堆和最小堆是二叉堆的两种形式。最大堆&#xff1a;根结点的键值是所有堆结点键值中最大者。最小堆&#xff1a;根结点的键值是所有堆结…

一个 Task 不够,又来一个 ValueTask ,真的学懵了!

一&#xff1a;背景 1. 讲故事前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载&#xff0c;真是日了狗了&#xff0c;一个 Task 已经够学了&#xff0c;又来一个 ValueTask&#xff0c;晕&#xff0c;方法签名如下&#xff1a;publ…

java class类型参数_使用Class对象实例化Java类型参数/ generic

如何实例化Java泛型对象,该对象仅接受类或参数给出的类型参数宾语&#xff1f;例如&#xff1a;通常,可以使用以下语法实例化Integer对象的ArrayList&#xff1a;ArrayList foo new ArrayList();但是,给定一个Class诸如Integer.class之类的对象,怎么能创建一个类似的ArrayList…