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应用托管成本的机会有积极的…

简单聊聊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;为何这么说。今天就跟你聊聊这…

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;甚至每个程序员都有自己的一套想法。无论是怎么样的…

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

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

如何在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…

Magicodes.IE 3.0重磅设计畅谈

Magicodes.IE 3.0重磅设计畅谈总体设计图Magicodes.IE导入导出通用库&#xff0c;支持Dto导入导出、模板导出、花式导出以及动态导出&#xff0c;支持Excel、Csv、Word、Pdf和Html。IE在去年年底重构一次之后&#xff0c;经过这么长时间的迭代&#xff0c;又迎来了瓶颈。根据本…

php引用类,thinkphp引用类的使用

比如发送邮件类phpmailer1.将核心文件放入ORG目录下2.在使用的地方&#xff0c;引入这个类文件如何引入呢&#xff1f;import(.ORG.phpmailer);这个表示引入当前项目中的ORG中的phpmailer.class.php文件3.引入之后就可以使用文件中的类了public function sendEmail() {import(.…

Net5 已经来临,让我来送你一个成功

没错&#xff0c;那就是“下载成功”。现在&#xff0c;已经可以急速下载.Net5 docker 镜像 .Net 5 进行今天已经正式发布&#xff0c;想必各位已经通过各种渠道了解到了此次发布的所有内容。并且也都体会到了这次凑成三连的金 scott 是什么效果&#xff08;啊哈&#xff0c;三…

推荐几款强大流行的BI系统

高级架构师俱乐部 读完需要2分钟速读仅需 1 分钟企业在日常运营过程中&#xff0c;需要根据公司实时经营数据来做未来决测或者发现经营中的问题&#xff0c;在此过程中离不开对数据的分析&#xff0c;而平常利用 excel 等方式极大的提高了领导层快速做出决测的成本&#xff0c…

php 4位数字不足补零,php实现数字不足补0的方法

php实现数字不足补0的方法发布时间&#xff1a;2020-08-28 09:51:06来源&#xff1a;亿速云阅读&#xff1a;100作者&#xff1a;小新这篇文章将为大家详细讲解有关php实现数字不足补0的方法&#xff0c;小编觉得挺实用的&#xff0c;因此分享给大家做个参考&#xff0c;希望大…

起点低,怎么破?

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第91篇原创文章洋友问&#xff1a;“洋哥&#xff0c;我北漂多年&#xff0c;专科毕业从农村出来&#xff0c;感觉做什么都不顺&#xff0c;我该怎么办”。和他聊了聊&#xff0c;他毕业后就来北京打工&#xff0c;尝…

C# Span 源码解读和应用实践

一&#xff1a;背景 1. 讲故事这两天工作上太忙没有及时持续的文章产出&#xff0c;和大家说声抱歉&#xff0c;前几天群里一个朋友在问什么时候可以产出 Span 的下一篇&#xff0c;哈哈&#xff0c;这就来啦&#xff01;读过上一篇的朋友应该都知道 Span 统一了 .NET 程序 栈 …

[C#.NET 拾遗补漏]12:死锁和活锁的发生及避免

多线程编程时&#xff0c;如果涉及同时读写共享数据&#xff0c;就要格外小心。如果共享数据是独占资源&#xff0c;则要对共享数据的读写进行排它访问&#xff0c;最简单的方式就是加锁。锁也不能随便用&#xff0c;否则可能会造成死锁和活锁。本文将通过示例详细讲解死锁和活…