山東大學(xué)匯編語(yǔ)言上機(jī)實(shí)驗(yàn)-實(shí)驗(yàn)五_第1頁(yè)
山東大學(xué)匯編語(yǔ)言上機(jī)實(shí)驗(yàn)-實(shí)驗(yàn)五_第2頁(yè)
山東大學(xué)匯編語(yǔ)言上機(jī)實(shí)驗(yàn)-實(shí)驗(yàn)五_第3頁(yè)
山東大學(xué)匯編語(yǔ)言上機(jī)實(shí)驗(yàn)-實(shí)驗(yàn)五_第4頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

子程序設(shè)計(jì)2.6顯示學(xué)生名次表 rank編制一個(gè)程序,要求接受鍵盤(pán)輸入的一個(gè)班的學(xué)生成績(jī),并存放于一個(gè)50字的grade數(shù)組中,其中g(shù)rade+i保存學(xué)號(hào)為I+1的學(xué)生成績(jī)。然后根據(jù)grade中的學(xué)生成績(jī),把學(xué)生成績(jī)依次填入50字的rank數(shù)組中,其中rank+i的內(nèi)容是學(xué)號(hào)為i+1的學(xué)生的名次。再按學(xué)號(hào)順序把名次從終端上顯示出來(lái)。本題要做的主要工作和例2.2的內(nèi)容是完全一樣的,只是增加了由用戶鍵入學(xué)生成績(jī)及輸出學(xué)生名次兩個(gè)部分的內(nèi)容,因此這三個(gè)部分可以用子程序結(jié)構(gòu)來(lái)完成。子程序結(jié)構(gòu)劃分的層次圖如圖2.17所示,可以看出,main為主要模塊,其下一層的三個(gè)模塊為程序的三大部分?,F(xiàn)將各模塊說(shuō)明如下:1.模塊名:main為總模塊輸入:從鍵盤(pán)輸入一個(gè)班的學(xué)生成績(jī)輸出:顯示一個(gè)班的學(xué)生成績(jī)功能:根據(jù)輸入的學(xué)生成績(jī),計(jì)算并顯示學(xué)生名次。算法如下:一個(gè)學(xué)生名次等于成績(jī)高于該學(xué)生的人數(shù) +1.2.模塊名:input輸入:以學(xué)號(hào)為序型鍵盤(pán)輸入一個(gè)班的學(xué)生成績(jī)。各個(gè)成績(jī)之間用逗號(hào)隔開(kāi),最后以回車符號(hào)結(jié)束。輸出:把一個(gè)班的學(xué)生成績(jī)存入 grade數(shù)組。功能:接受一個(gè)班的學(xué)生成績(jī)。調(diào)用子模塊decibin把鍵盤(pán)輸入的一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)。調(diào)用子模塊crlf完成回車,換行功能。3.模塊名:rankp輸入:從grade數(shù)組取得一個(gè)班的學(xué)生成績(jī)。輸出:以學(xué)號(hào)為序計(jì)算出該班每個(gè)學(xué)生的名次存入 rank數(shù)組。功能:計(jì)算一個(gè)班的學(xué)生成績(jī)。算法為:一個(gè)學(xué)生的名次等于成績(jī)高于該生的學(xué)生人數(shù)加1.4,。模塊名;output輸入:把rank數(shù)組取得一個(gè)班的學(xué)生名次。輸出:把一個(gè)班的學(xué)生名次以學(xué)號(hào)為序在總端上顯示出來(lái)。功能:先是一個(gè)班的學(xué)生名次。調(diào)用子模塊decibin把鍵盤(pán)輸入的一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)。調(diào)用子模塊crlf完成回車,換行功能。5:模塊名:decilin輸入:從鍵盤(pán)輸入一個(gè)十進(jìn)制數(shù)。輸出:把該數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)并存入 BX寄存器中。功能:從鍵盤(pán)輸入一個(gè)十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)并存入 BX寄存器中。6.模塊名:crlf輸出:向終端發(fā)出回車換行符。功能:完成一次回車換行操作。7.模塊名:binidec輸入:從BX寄存器取得一個(gè)二進(jìn)制數(shù)。輸出:在終端屏幕顯示一個(gè)十進(jìn)制數(shù)。功能:把BX寄存器中的二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),并在終端顯示出來(lái)。調(diào)用子模塊DCE_DIV用來(lái)作除法運(yùn)算并顯示字符。8.模塊名:dec_div輸入:從BX寄存器中的二進(jìn)制數(shù)除以相應(yīng)的十的冪,并在屏幕顯示一位商。余數(shù)保存在BX寄存器中。有了以上的層次圖及模塊說(shuō)明,對(duì)程序的全貌有了基本了解。在圖2.18們給出了除rankp以外的其余各個(gè)子程序的程序框圖。Rankp的框圖與圖

中,我2.4相同。圖2.19是程序清單,圖 2.20是本例的運(yùn)行情況。;PROGRAMTITLEGOESHERE——Rank;**************************************************************************datareasegmentgradedw50dup(?)rankdw50dup(?)countdw?mess1db'Grade?$'mess2db13,10,'InputError!',13,10,'$'mess3db'Rank:$'datareaends;**************************************************************************prognamsegment;--------------------------------------------------------------------------main procfarassumecs:prognam,ds:datareastart:;setupstackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datareamovds,ax;MAINPARTOFPROGRAMGOESHEREcall inputcall rankpcall outputretmain endp;--------------------------------------------------------------------------input procnearlea dx,mess1movah,09int 21h;movsi,0movcount,0enter:call decibininc countcmpdl,','je storecmpdl,13je exit2jne errorstore:movgrade[si],bxaddsi,2jmpentererror:lea dx,mess2movah,09int 21hexit2:movgrade[si],bxcall crlfretinput endp;--------------------------------------------------------------------------rankp procnearmovdi,countmovbx,0loop1:movax,grade[bx]movwordptrrank[bx],0movcx,countlea si,gradenext:cmpax,[si]jg no_countinc wordptrrank[bx]no_count:addsi,2loopnextaddbx,2decdijne loop1retrankp endp;--------------------------------------------------------------------------output procnearlea dx,mess3movah,09int 21h;movsi,0movdi,countnext1:movbx,rank[si]call binidecmovdl,','movah,02int 21haddsi,2decdijnz next1call crlfretoutput endp;--------------------------------------------------------------------------decibin procnear;proceduretoconverdecimalonkeybdtobinary.;resultisleftinBXregister.movbx,0;getdigitfromkeyboard,converttobinarynewchar:movah,1int 21hmovdl,alsubal,30hjl exit1cmpal,9djg exit1cbw;(digitisnowinAX);multiplynumberinBXby10decimal.xchgax,bxmovcx,10dmulcxxchgax,bx;adddigitinAXtonumberinBXaddbx,axjmpnewcharexit1: retdecibin endp;--------------------------------------------------------------------------binidec procnear;proceduretoconvertbinarynumberinBXtodecimal;onconsolescreenpushbxpushcxpushsipushdimovcx,100dcall dec_divmovcx,10dcall dec_divmovcx,1dcall dec_divpopdipopsipopcxpopbxretbinidec endp;--------------------------------------------------------------------------dec_div procnear;sub_subroutinetodividenumberinBXybnumberinCXprintquotientonscreenmovax,bxmovdx,0divcxmovbx,dxmovdl,al;printthecontentsofDLonscreenadddl,30hmovah,02hint 21hretdec_div endp;--------------------------------------------------------------------------crlf procnear;printcarriagereturnandlinefeedmovdl,0ahmovah,02hint 21h;movdl,0dhmovah,02hint 21h;retcrlf endp;--------------------------------------------------------------------------prognamends;**************************************************************************endstart程序框圖如下:實(shí)驗(yàn)截圖如下:實(shí)驗(yàn)總結(jié):在復(fù)雜的程序設(shè)計(jì)中,采用模塊化結(jié)構(gòu)可以劃分功能、分界程序,使得程序有復(fù)雜變簡(jiǎn)單,變清晰。主程序和子程序之間嵌套使用, 使得寫(xiě)代碼時(shí)思路更清楚明白, 讀代碼時(shí)方便快捷清晰明了。這點(diǎn)跟高級(jí)編程語(yǔ)言類似。而此程序中變量p可以跟蹤并控制輸入的人數(shù)、輸名字要預(yù)留緩存區(qū)、十進(jìn)制碼要和二進(jìn)制碼間相互轉(zhuǎn)換,這些又體現(xiàn)了編程低級(jí)語(yǔ)言的特點(diǎn)。學(xué)習(xí)匯編語(yǔ)言,重要的事掌握如何通過(guò)匯編指令和程序來(lái)控制計(jì)算機(jī)各個(gè)組成部件工作,完成一系列任務(wù)。因此,學(xué)習(xí)匯編用語(yǔ)言與學(xué)習(xí)高級(jí)語(yǔ)言的不同之處是要學(xué)習(xí)如何深入到計(jì)算機(jī)的內(nèi)部進(jìn)行控制。通過(guò)這次實(shí)驗(yàn),加深了我對(duì)匯編語(yǔ)言的理解。每一步的輸入、存儲(chǔ)、轉(zhuǎn)換、輸出,都需要一條條的匯編指令執(zhí)行。而且每一步都有自己的源和目標(biāo)的地址,每個(gè)數(shù)據(jù)都有自己的存儲(chǔ)空間和地址,我們可以很清晰的“跟蹤”每一個(gè)數(shù)據(jù)的變化和地址的轉(zhuǎn)移。實(shí)驗(yàn)體會(huì):在復(fù)雜的程序設(shè)計(jì)中,采用模塊化結(jié)構(gòu)可以劃分功能、分界程序,使得程序有復(fù)雜變簡(jiǎn)單,變清晰。主程序和子程序之間嵌套使用,使得寫(xiě)代碼時(shí)思路更清楚明白,讀代碼時(shí)方便快捷清晰明了。這點(diǎn)跟高級(jí)編程語(yǔ)言類似。而此程序中變量p可以跟蹤并控制輸入的人數(shù)、輸名字要預(yù)留緩存區(qū)、十進(jìn)制碼要和二進(jìn)制碼間相互轉(zhuǎn)換,這些又體現(xiàn)了編程低級(jí)語(yǔ)言的特點(diǎn)。學(xué)習(xí)匯編語(yǔ)言,重要的事掌握如何通過(guò)匯編指令和程序來(lái)控制計(jì)算機(jī)各個(gè)組成部件工作,完成一系列任務(wù)。因此,學(xué)習(xí)匯編用語(yǔ)言與學(xué)習(xí)高級(jí)語(yǔ)言的不同之處是要學(xué)習(xí)如何深入到計(jì)算機(jī)的內(nèi)部進(jìn)行控制。通過(guò)這次實(shí)驗(yàn),加深了我對(duì)匯編語(yǔ)言的理解。每一步的輸入、存儲(chǔ)、轉(zhuǎn)換、輸出,都需要一條條的匯編指令執(zhí)行。而且每一步都有自己的源和目標(biāo)的地址,每個(gè)數(shù)據(jù)都有自己的存儲(chǔ)空間和地址,我們可以很清晰的“跟蹤”每一個(gè)數(shù)據(jù)的變化和地址的轉(zhuǎn)移。2.7計(jì)算工資 scremp編寫(xiě)一個(gè)程序,接受用戶輸入的工作時(shí)間及工資率,顯示計(jì)算得到的工資數(shù)。本程序有三個(gè)部分組成,輸入工作時(shí)間和工資率,計(jì)算工資;顯示工資值。在輸入輸出部分,與例2.6一樣,必須考慮自負(fù)與數(shù)字的裝換,以及十進(jìn)制換二進(jìn)制,二進(jìn)制換十進(jìn)制的問(wèn)題。除此之外,還應(yīng)注意到本例中的輸入數(shù)可能是小數(shù)。在這里并不需要使用浮點(diǎn)數(shù)格式來(lái)進(jìn)行計(jì)算,只是在計(jì)算中必須處理小數(shù)。我們采用在接受輸入數(shù)字是記錄小數(shù)點(diǎn)后的位數(shù),并把兩個(gè)輸入數(shù)的小數(shù)點(diǎn)后位數(shù)之和存放在nodec單元當(dāng)中。在計(jì)算工資的乘法中,并不考慮小數(shù)點(diǎn)后的存在,而輸出的工資數(shù)又只取出小數(shù)點(diǎn)后的兩位數(shù),因此我們用SHIFT單元記錄移位因子,用ADJUST單元記錄舍入值。對(duì)于不同的NODEC可以分以下情況進(jìn)行處理。1.NODEC>6我們知道,對(duì)于16位整數(shù)而言,及其允許的最大數(shù)是65535,對(duì)于NODEC>6的數(shù),移位因子將>=10000,該數(shù)已經(jīng)超過(guò)機(jī)器允許的范圍,因此本例限制NODEC的值必須<=6.如果NODEC>6,則作為溢出處理,此時(shí)將輸出值變?yōu)?。2.NODEC=3~6此時(shí)移位因子 SHIFT=(10)^nodec—2舍入值 ADJUST=1/2SHIFT例如:輸入工作時(shí)間為 8.52,工資率為10.25,則乘機(jī)為Product=852X1025=873300移位因子為 shift=(10)^nodec—2舍入值 ADJUST=1/2SHIFT=50作舍入及移位處理Product+adjust)/shift=(873300+50)/100=8733又如:輸入工作時(shí)間為 65.245,工資率為8.52則, product=65245X852=55588740SHIFT=(10)^5-2=1000Adjust=500作舍入及移位處理55588740+500/1000=55589240/1000=55589金處理的值只是取得了答案的有效值,并未考錄小數(shù)點(diǎn)的位置,這個(gè)問(wèn)題將會(huì)在輸出時(shí)得到解決。3.NODEC=0~2在這種情況下,乘積的結(jié)果不必做舍入及移位處理,只需記錄NODEC的值,并在輸出顯示是解決小數(shù)點(diǎn)的問(wèn)題即可在計(jì)算時(shí)還需啊喲說(shuō)明一個(gè)問(wèn)題:由于采用整數(shù)運(yùn)算,要求輸入數(shù)不超過(guò)6535,任意輸入數(shù)超過(guò)改制就做溢出處理,在這里我們用輸出0來(lái)表示。此外,兩個(gè)輸入數(shù)的成績(jī)可能得到三十二位二進(jìn)制數(shù)的結(jié)果,這用一般的運(yùn)算乘法指令就可以得到。對(duì)于這樣的雙精度數(shù)作除法運(yùn)算時(shí),盡管我們已經(jīng)限制 shift的值不超過(guò)65535,但字運(yùn)算的出發(fā)指令要求雙精度被除數(shù)和單精度的除數(shù)相除,其結(jié)果應(yīng)該是雙精度的商,否則作為溢出處理。為了避免這種溢出情況的發(fā)生, 我們采用以下程序段來(lái)作為除法。 設(shè)在以下程序段運(yùn)行前,我們已取得雙精度被除數(shù)在DX:AX中,除數(shù)在shift單元中,除法運(yùn)算結(jié)果的商在 DX,AX中。模塊名:begin為中控制模塊hour和工資rate輸入:接受從鍵盤(pán)輸入的工作時(shí)間輸出:在屏幕上顯示工資值 wage功能:根據(jù)工作時(shí)間和工資率計(jì)算工資Wage=hour*rate調(diào)用:2:模塊名:Q10SCR功能:清除屏幕3:模塊名:Q20CURS功能:置于光標(biāo)位置4模塊名:B10inpt輸入:接受從鍵盤(pán)輸入的以小時(shí)為單位的工作時(shí)間及工資率輸出:把工作時(shí)間緩存HASPAR緩存區(qū),吧工資率存入ratepar緩沖區(qū)功能:接受從鍵盤(pán)輸入的工作時(shí)間及工資率,分別存入相應(yīng)的緩存區(qū)中。5模塊名:D10HOUR輸入:從HRSPAR中取出工作時(shí)間輸出:把轉(zhuǎn)換為二進(jìn)制的時(shí)間存入 BINHRS單元中。功能:調(diào)用子過(guò)程 M10ASBI,把工作時(shí)間從 ASCLL嗎轉(zhuǎn)換為二進(jìn)制數(shù)。6模塊名:E10RATE輸入:從RATEPAR中取出工資率。輸出:把轉(zhuǎn)換為二進(jìn)制的工資率存入 BINRATE單元中。功能:調(diào)用子過(guò)程 M10ASBI,把工資率從 ASCLL碼轉(zhuǎn)換為二進(jìn)制數(shù)。7:模塊名:M10ASBI輸入:根據(jù)調(diào)用過(guò)程給出的指針以及字符個(gè)數(shù)取得一個(gè)ASCLL字符竄、輸出:將ASCLL字符竄轉(zhuǎn)換為二進(jìn)制數(shù),結(jié)果存放與BINAL單元中功能:把ASCLL字符竄轉(zhuǎn)換為二進(jìn)制數(shù)。同時(shí)記錄輸入的小數(shù)點(diǎn)后的位數(shù)累計(jì)在NODEC單元中。8:模塊名:F10MULT輸入:從binHRAS中取得工作時(shí)間,從 BINRATE中取得工資率。輸出:根據(jù)工作時(shí)間及工資率的取值將其結(jié)果存放在 DX,AX中功能:把工作時(shí)間和工資率的成績(jī)經(jīng)過(guò)舍入和移位處理后得到的二進(jìn)制工資值存放在DX.:AX中。9模塊名:G10WAGE輸入:DX,AX中的二進(jìn)制工資數(shù)以及 NODEC單元中的小數(shù)點(diǎn)后的位數(shù)輸出:把二進(jìn)制的工資數(shù)轉(zhuǎn)換為 ASCLL碼存放在ASCWAGE為首地址的字符竄當(dāng)中功能:模塊名輸入:ASCWAGE中的字符竄輸出:把字符竄在屏幕上顯示出來(lái)功能:顯示工資數(shù);PROGRAMTITLEGOESHERE--SCREMP;Enterhours&rate,displaywage;*************************************stacksgsegmentparastack'stack'dw32dup(?)stacksgends;*************************************datasg segmentpara 'data'hrsparlabelbyte;Hoursparameterlist;maxhlendb6acthlendb?hrsflddb6dup(?)rateparlabelbyte;rateparameterlist;maxrlendb6actrlendb?rateflddb6dup(?)messg1db 'Hoursworked?','$'messg2db 'Rateofpay?','$'messg3db 'Wage='ascwagedb 14dup(30h),13,10,'$'messg4db13,10,'Overflow!',13,10,'$'adjustdw?binvaldw0binhrsdw0binratedw0coldb0decinddb0mult10dw01nodecdw0rowdb3shiftdw?tenwddw10tempdxdw?tempaxdw?datasgends;*************************************codesgsegmentpara'code';-------------------------------------beginprocfar;mainpartofprogramassumecs:codesg,ds:datasg,ss:stacksg,es:datasg;setupstackforreturnpushdssubax,axpushax;setDSregistertocurrentdatasegmentmovax,datasgmovds,axmoves,ax;mainpartofprogramgoesheremovax,0600h;CALLDISPcallq10scrcallq20cursa20loop:callb10inptcmpacthlen,0je a30calld10hourcalle10ratecallf10multcallg10wagecallk10dispjmpa20loopa30:;calltimedatemov ax,0600hcallq10scrretbegin endp;-------------------------------------------Inputhours&rateb10inptprocnearleadx,messg1movah,09hint21hleadx,hrsparmovah,0ahint21hcmpacthlen,0jneb20retb20:movcol,25callq20cursleadx,messg2movah,09hint21hleadx,rateparmovah,0ahint21hretb10inptendp;--------------------------------------------Processhours:--------------d10hourproc nearmov nodec,0mov cl,acthlensubch,chleasi,hrsfld-1addsi,cxcallm10asbimov ax,binvalmov binhrs,axretd10hourendp;---------------------------------------------Processrate:-------------e10rateprocnearmovcl,actrlensubch,chleasi,ratefld-1addsi,cxcallm10asbimovax,binvalmovbinrate,axrete10rateendp;----------------------------------------------Multiply,round,&shift---------------------f10multprocnearmovcx,07leadi,ascwagemovax,3030hcldrepstoswmovshift,10movadjust,0movcx,nodeccmpcl,06jaf40deccxdeccxjlef30movnodec,02movax,01f20:multenwdloop f20mov shift,axshrax,1mov adjust,axf30:mov ax,binhrsmulbinrateaddax,adjustadcdx,0mov tempdx,dxmov tempax,ax;cmpadjust,0jz f50;mov ax,dxmov dx,0divshiftmov tempdx,axmov ax,tempaxdivshiftmov dx,tempdxmov tempax,axjmpf50;f40:movmov

ax,0dx,0f50:retf10multendp;-------------------------------------ConverttoASC-------------g10wage proc nearleasi,ascwage+11mov byteptr[si],'.'addsi,nodecg30:cmpbyteptr[si],'.'jneg35decsig35:cmpdx,0jnzg40cmpax,0010jb g50g40:mov ax,dxmov dx,0divtenwdmov tempdx,axmov ax,tempaxdivtenwdmov tempax,axor dl,30hmov [si],dldecsimov dx,tempdxjmp g30g50:or al,30hmov [si],alretg10wage endp;-----------------------------------------Displaywage-------------k10dispproc nearmov col,50callq20cursmov cx,10leasi,ascwagek20:cmpbyteptr[si],30hjnek30mov byteptr[si],20hincsiloop k20k30:leadx,messg3mov ah,09int 21hcmprow,20jaek80incrowjmpk90k80:mov ax,0601hcallq10scrmov col,0callq20cursk90:retk10dispendp;-----------------------------------------ConvertASCtobinary-----------------------m10asbiprocnearmovmult10,01movbinval,0movdecind,0subbx,bxm20:moval,[si]cmpal,'.'jnem40movdecind,01jmpm90m40:andax,000fhmulmult10jcoverflowaddbinval,axjc overflowmov ax,mult10multenwdmov mult10,axcmpdecind,0jnzm90incbxm90:decsiloop m20cmpdecind,0jz m100addnodec,bxjmpm100overflow:mov binval,0m100:retm10asbiendp;----------------------------------------------;Scrollscreen;--------------q10scr proc nearmov bh,07subcx,cxmov dx,184fhint 10hretq10scr endp;--------------------------------------------------Setcursor--------------q20cursproc nearmov ah,2subbh,bhmov dh,rowmov dl,colint 10hretq20cursendp;---------------------------------------------------codesgendsendbegin該部分的程序框圖如下:實(shí)驗(yàn)截圖如下:實(shí)驗(yàn)總結(jié):在進(jìn)行接受用戶工作時(shí)間及工資率的時(shí)候必須先畫(huà)好結(jié)構(gòu)框圖,避免出現(xiàn)前后不對(duì)應(yīng)的情況,字的除法運(yùn)算指令要求雙精度的被除數(shù)和單精度的除數(shù)相處,結(jié)果應(yīng)該是單精度的商。2.8HANOI塔題編寫(xiě)HANOI塔的程序,在這個(gè)謎題中,A軸自下而上的疊有大小逐漸見(jiàn)效的N的盤(pán)子,現(xiàn)在要求把它們都移到C軸上并保持原來(lái)的秩序。移動(dòng)時(shí)允許把盤(pán)子暫時(shí)存放在B軸但必須遵循以下規(guī)則:1:一次只能有一個(gè)盤(pán)子從一個(gè)軸移動(dòng)打另外一個(gè)軸2:一個(gè)盤(pán)子不能放在比他小的盤(pán)子上面。這是一個(gè)經(jīng)典的遞歸子程序的例子。我們用N表示盤(pán)子數(shù),并從小到大把盤(pán)子編號(hào)為1,2,3,。。。。。。N。用X,Y,Z,表示起始軸,宗建洲和最終軸。用UVI表示第個(gè)盤(pán)子從U軸移動(dòng)到V軸,V可以是X,Y,Z,中的任意一個(gè)軸基數(shù):HANOI(1,X,Y,Z)顯示X1Z歸納步驟:HANOI(N,X,Y,Z)(N>1)做以下三步1執(zhí)行HANOI(N-1,X,Z,Y)2顯示XNZ3執(zhí)行HANOI(N-1,X,Y,Z)根據(jù)這一算法可以分析出 HANOI的執(zhí)行過(guò)程如圖所示1模塊名:main 為總控制塊輸入:接受從鍵盤(pán)輸入的盤(pán)子數(shù)N及起始中間和最終軸名,存放在BX,CX,SI,DI,寄存器當(dāng)中。輸出:以UIV形式,順序顯示出盤(pán)子的移動(dòng)辦法功能:用遞歸計(jì)算并顯示出 HANOI的移動(dòng)辦法基數(shù):HANOI(1,X,Y,Z)顯示XIZ歸納步驟:HANOI(N,X,Y,Z,)(N-1)(1)執(zhí)行HANOI(N-1,X,,Z,Y)(2)顯示XNZ(3)執(zhí)行HANOI(N-1,Y,X,Z)調(diào)用子程序接受盤(pán)子數(shù)調(diào)用子程序?qū)崿F(xiàn)回車,換行功能2模塊名:decibin輸入:鍵盤(pán)接受盤(pán)子數(shù) N輸出:把轉(zhuǎn)換為二進(jìn)制的 N值存入BX寄存器當(dāng)中。功能:把從鍵盤(pán)接受的十進(jìn)制裝換為二進(jìn)制數(shù)并存入 BX寄存器當(dāng)中。3:模塊名:HANOI輸入:從BX寄存器中取得盤(pán)子數(shù) N輸出:顯示盤(pán)子的移動(dòng)辦法功能:用遞歸算法計(jì)算并顯示 HANOI的結(jié)果4模塊名:CTRF功能:顯示回車,換行5:模塊名:save功能:保存NX,Y,Z,入站6:模塊名:restore功能:恢復(fù)N,X,Y,Z7:模塊名:PRINT功能:顯示XNZ調(diào)用子程序BINIDEC把N值從二進(jìn)制轉(zhuǎn)換為十進(jìn)制并在屏幕上顯示出來(lái)調(diào)用子程序CRLF回車換行8:模塊名:BINIDEC輸入:從BX寄存器中取得N值輸出:把N值以是十進(jìn)制形式在屏幕上顯示出來(lái)功能:把BX中的二進(jìn)制N值轉(zhuǎn)換為十進(jìn)制形式,并在屏幕上顯示出來(lái)。源程序如下:;**********************************************datareasegmentmessage1db'N=?',0ah,0dh,'$'message2db'WhatisthenameofspindleX?'db0ah,0dh,'$'message3db'WhatisthenameofspindleY?'db0ah,0dh,'$'message4db'WhatisthenameifspindleZ?'db0ah,0dh,'$'flagdw0constantdw10000,1000,100,10,1decibincrlfdatarea ends;**********************************************prognamsegment;----------------------------------------------main proc farassumecs:prognam,ds:datareastart:;setupstackforreturnpush dssubax,axpush ax;setDSregistertocurrentdatasegmentmovax,datareamovds,ax;mainpartofprogramgoeshereleadx,message1movah,09hint21hcallcall;cmpbx,0jz exit;leadx,message2movah,09hint 21hmovah,01hint 21hmovah,0movcx,axcall crlf;leadx,message3movah,09hint 21hmovah,01hint 21hmovah,0movsi,axcall crlf;leadx,message4movah,09hint 21hmov ah,01hint 21hmovah,0movdi,axcall crlf;callhanoi;exit:ret;returntoDOS;mainendp;----------------------------------------hanoiprocnear;definesubprocedure;SolvestowerofHANOIpuzzle;Argement:(BX)=N,(CX)=X,(SI)=Y,(DI)=Zcmpbx,1jebasiscallsavedecbxxchgsi,dicallhanoicallrestorcallprintdecbxxchgcx,sicallhanoijmpreturnb

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論