吉林省可信网站认证牌匾,怀化市建设局网站,诸城网络推广公司,网络游戏开发平台近六周的课程设计#xff0c;编了一个四百行的汇编程序#xff0c;编的过程很不顺利#xff0c;遇到种种意想不到的困难#xff0c;但最终能够实现#xff0c;可谓欣喜若狂#xff0c;这期间学到了好多好多#xff0c;遇到问题怎么精下心来解决#xff0c;同时对汇编的…近六周的课程设计编了一个四百行的汇编程序编的过程很不顺利遇到种种意想不到的困难但最终能够实现可谓欣喜若狂这期间学到了好多好多遇到问题怎么精下心来解决同时对汇编的理解也更加深刻了。所谓TAP任务指派问题简单来说我实现的是有六个人有六项任务没个人做每一项任务的所消耗的时间代价不同有一个六阶参考矩阵代价表然后将六个员工编号为123456固定不变接下来随机产生几种任务的排序方案假设任务命名为ABCDEF可能随机产生一种方案为EDCABF这意思就是第一个人做E任务第二个人做D任务依次下去最后计算每一种方案的总代价然后计算每一种方案的带价总和然和输出最优(代价值最小)的那一种方案。运行结果图附源码DATAS SEGMENTstr1 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,4peo db 1,2,3,4,5,6StrEnter db 0dh,0ah,$ ;回车换行n dw 1 ;用于显示数组为矩阵计数temp db 2sii 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 ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码;显示“参考数组”lea dx,str1mov ah,9int 21h;显示回车换行call CRLF ;调用子程序;**********************显示参考矩阵********************************************push silea si,arraymov cx,36 ;cx是loop的参考值j1:mov dl,[si]add dl,30hmov ah,2 ;调用2号中断显示单个值int 21hmov ax,ndiv chushucmp ah,0jnz tzcall CRLFtz:inc ninc siloop j1pop sicall CRLF;调用一次回车换行;*****************显示员工排列的顺序******************************************lea dx,str5mov ah,9int 21hcall CRLF;*****************显示“你要选择多少种方案(1-8)”*************************;----显示提示语---------------------------------------------------------------lea dx,str3mov ah,9int 21hcall CRLF;----输入选择-----------------------------------------------------------------j2: mov ah,7int 21hcmp al,6ja j2cmp al,1jb j2mov dl,almov ah,2int 21hmov save,al ;因为下面si:步骤会更改al的值call CRLF;*****************显示“feasible plans:”**************************************s1: lea dx,str2mov ah,9int 21hcall CRLF;************************产生随机方案********************************************mov al,savesub al,30h ;减去30h变成数字mov ah,0lea di,buf ;取buf首地址mov cx,axC0:call Randomloop C0lea dx,bufmov ah,9int 21hcall CRLF;****************显示“这几种解决方案的代价值”*******************************lea dx,str6mov ah,9int 21h;********************计算每一种解决方案的值***************************************call CALCU ;可能将save的值改变了call CRLF;*****************显示“最优的那个方案以及其代价值”****************************call CRLFlea dx,str4mov ah,9int 21h;******************计算得到最优的那个方案**************************************call CRLF;lea dx,Str7 ;显示这最小方案的代价;mov ah,9;int 21hlea si,yycall CALBEST;*******************************************************************************call over ;调用结束程序;*******************************************************************************;######################调用的子程序#############################################;****回车换行*******************************************************************CRLF PROC NEARlea dx,StrEntermov ah,9int 21hRETCRLF ENDP;****结束程序*******************************************************************OVER PROC NEARMOV AH,4CHINT 21HRETOVER ENDP;******产生随机方案******************************************************************;入口为 di,将di后的六位填充六个随机数Random proc nearpush cxpush simov sii,dimov cx,6L3:push cxL0:xor ax,axout 43h,alin al,40hcmp al,1jb L0cmp al,6ja L0or al,40hmov si,siimov [di],almov ax,dicmp ax,sijz L2sub ax,simov cx,axL1:mov ah,[si]cmp ah,[di]jz L0inc siloop L1L2:pop cxinc diloop L3mov [di],0dhinc dimov [di],0ahinc dimov [di],$pop sipop cxretRandom endp;****计算代价值*****************************************************************;入口peo db 6 buf db 96 array(参考数组) db save db (保存几个方案);出口res dw 8(保存所有方案的代价值)CALCU PROC NEAR ;g97push sipush di ;push bpcall CRLFcall CONVERTBUFTOBUFF ;将buf中的有用数据存到buff中lea si,yy ;保存六种方案的代价值mov q,0 ;大循环的判断条件 dbf0:;将指针指向缓冲区的头部lea di,buffmov ah,0 ;控制到buff中的第几个方案的头地址mov al,qmul chushu ;乘以6add di,ax ;fla标记是将si和di指向两个头指针mov ax,0mov ch,0 ;小循环的判断条件fl:inc axpush ax ;dec axmul chushu ;(x-1)*6y (chushu6)mov bl,[di]mov bh,0add ax,bx ;计算要参考代价表的第几个值存在ax中lea bp,array ;参考代价表dec ax ;自减一下因为没从0开始add bp,axmov dl,[bp] ;取参考表的值到dlmov dh,0add countr,dl ;和值不断增加inc dipop axinc chcmp ch,chushu ;判断是否循环了六次JNE flmov dl,countr ;把一种方案的六次的值放到dl中然后赋给mov [si],dl ;将计算的结果压到yymov dl,[si]mov OUTp,dlcall OUTPutinc si;*;mov countr,0 ;和重新清0重新计算下一个方案的结果值;mov dl,[si];mov OUTp,dl;;call OUTPut ;输出显示inc qmov al,qcmp al,save ;比较大循环和save的值 看看是否结束JNE f0pop bppop dipop siRETCALCU ENDP;***计算最小的那个代价值*******************************************************;入口 res dw 8;出口 best dwCALBEST PROC NEARpush simov bl,1 ;记录最小的这个代价值是yy中的第几个mov cl,save ;控制循环几次dec clmov ch,0;mov dx,cx ;验证save是否正确;add dx,30h;mov ah,2;int 21h;;;;;;;;;;验证压入YY的值是否正确;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mov dl,[si]mov best,dlcmp cx,0 ;如果save等于0则不要比较直接跳转结束jz q3inc siq1:mov dl,[si];add dx,30h;mov ah,2;int 21hinc bl ;记录是数组中的第几个以便输出那个方案cmp dl,bestjnb q2 ;大于或等于则跳转到q2mov best,dlmov num,blq2:inc si ;si加一是字节如果保存的是dw类型的就要加2loop q1;此时已经计算好了dl和最小的值接下来时显示q3:mov dl,num ;第几个方案最小add dl,30hmov ah,2int 21hcall CRLF;依次输出这六个方案;mov dl,num;add dl,30h;mov ah,2;int 21hmov dl,numpush dilea di,buffmov dh,0dec dlmov al,dlmov ah,0mul chushuadd di,ax;显示最优方案的六个字母mov cx,6q10:mov dl,[di]add dl,40hmov ah,2int 21hinc diloop q10pop dicall CRLF;显示这最小方案的代价的提示语lea dx,Str7mov ah,9int 21hmov dl,best ;显示最小方案的代价值mov OUTp,dlcall OUTPutpop siRETCALBEST ENDP;*****将buf中的值去掉回车换行存到buff***********************************************************CONVERTBUFTOBUFF PROC NEARpush sisub save,30hmov al,savemov ah,0mov bl,6mul bl ;控制多少次循环mov cx,axmov bx,0lea si,buflea di,buffq4: mov dl,[si]sub dl,40hmov [di],dlinc siinc diinc bxcmp bx,6JNE q5add si,2mov bx,0q5: loop q4pop siRETCONVERTBUFTOBUFF ENDP;******将一个字节型的OUTp输出显示**********************************************OUTPut proc ;字节型的OUTp两位数的和push silea si,tempmov al,OUTpmov cx,1mov bl,10CX1:cmp al,10jb CX2 ;小于跳转sub ah,ah ;清0div blmov [si],ah ;余数赋给inc siinc cxsub ah,ah ;余数部分清0jmp CX1CX2:mov [si],al ;商赋给CX3:mov dl,[si] ;商显示add dl,30hmov ah,2int 21hdec si ;自减1然后显示余数loop CX3; ;循环两次 将商和余数显示出来mov dl, int 21hpop siRETOUTput endp;******************************************************************************CODES ENDSEND START