南昌大學(xué)匯編語言程序設(shè)計(jì)實(shí)驗(yàn)5-子程序設(shè)計(jì)實(shí)驗(yàn)_第1頁
南昌大學(xué)匯編語言程序設(shè)計(jì)實(shí)驗(yàn)5-子程序設(shè)計(jì)實(shí)驗(yàn)_第2頁
南昌大學(xué)匯編語言程序設(shè)計(jì)實(shí)驗(yàn)5-子程序設(shè)計(jì)實(shí)驗(yàn)_第3頁
南昌大學(xué)匯編語言程序設(shè)計(jì)實(shí)驗(yàn)5-子程序設(shè)計(jì)實(shí)驗(yàn)_第4頁
南昌大學(xué)匯編語言程序設(shè)計(jì)實(shí)驗(yàn)5-子程序設(shè)計(jì)實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

南昌大學(xué)實(shí)驗(yàn)報(bào)告學(xué)生姓名:學(xué)號:專業(yè)班級:實(shí)驗(yàn)類型:□驗(yàn)證√綜合□設(shè)計(jì)□創(chuàng)新實(shí)驗(yàn)日期:12.15實(shí)驗(yàn)成績:實(shí)驗(yàn)5子程序?qū)嶒?yàn)一.實(shí)驗(yàn)?zāi)康?.掌握主程序與子程序之間的調(diào)用關(guān)系及調(diào)用方法;2.掌握子程序調(diào)用過程中近程調(diào)用與遠(yuǎn)程調(diào)用的區(qū)別;3.掌握通過堆棧轉(zhuǎn)送參數(shù)的方法。4.掌握多模塊程序設(shè)計(jì)方法二.實(shí)驗(yàn)內(nèi)容1.將BUF開始的10個(gè)單元中的二進(jìn)制數(shù)轉(zhuǎn)換成兩位十六進(jìn)制數(shù)的ASCII碼,在屏幕上顯示出來。要求碼型轉(zhuǎn)換通過子程序HEXAC實(shí)現(xiàn),在轉(zhuǎn)換過程中,通過子程序DISP實(shí)現(xiàn)顯示。程序代碼:publicmaindatasegmentbufdw12,68,56,57,34,1,46,7,45,54countdb1,2,3,4,5,6,7,8,9,10waitdb',$'dataendscodesegmentassumecs:code,ds:datamain:movax,datamovds,axmovdx,0movcx,0movsi,0movdi,0again:movbx,buf[si]addsi,2callhexacleadx,waitcalldispmovdl,count[di];將count首地址單元內(nèi)容給dl來記數(shù)incdicmpdi,10;顯示所有數(shù)后dx為10跳出jeexitjmpagainexit:movah,4chint21hhexacprocnear;二進(jìn)制轉(zhuǎn)換為十六進(jìn)制輸出子程序movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintitaddal,7hprintit:movdl,alcalldisp;近調(diào)用dispdecchjnzrotateret;返回doshexacendpdispprocnear;輸出單個(gè)字符子程序movah,02hint21hretdispendpcodeendsendmain運(yùn)行結(jié)果:流程圖:2.編寫一個(gè)主程序,從鍵盤接收若干個(gè)字符,然后用遠(yuǎn)調(diào)用的方法,調(diào)用子程序統(tǒng)計(jì)字符串中字符’b’的個(gè)數(shù).子程序的參數(shù)是字符串的首地址TABLE,字符串長度N及字符”b”.子程序返回字符"b”的個(gè)數(shù).參數(shù)傳送采用堆棧實(shí)現(xiàn).主程序在子程序返回后,顯示字符”b”及其個(gè)數(shù)(設(shè)為一位十六進(jìn)制數(shù))。程序代碼:publicmain_1dotasegmentmess1db'pleaseinputyourstring,overedbypressenter:$',0ah,0dhmess2db0ah,0dh,'timesofthe"b"appearedis:$'mess7db0ah,0dh,'sorry,thecountsofthe"b"havemorethan15,pleasetryagain$'tabledb50,?,100dup(?),'$'dotaendscodesegmentassumecs:code,ds:datamain_2:movax,datamovds,axleadx,mess1;顯示mess1,提醒輸入字符movah,09hint21hleadx,tablemovah,0ah;輸入字符串int21hleasi,table;si指向串首址tablemovcl,[si+1]movch,0;cx中為字符串長度incsiincsimoval,'b'movah,0pushsipushcxpushax;si,cx,ax依次入棧callcomparepopax;ax出棧,統(tǒng)計(jì)個(gè)數(shù)在al中movcl,alcmpcl,10hjlerrorleadx,mess2;顯示mess2,輸出統(tǒng)計(jì)個(gè)數(shù)movah,09h;將個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制int21hmovdl,clanddl,0fh adddl,30hcmpdl,39hjlecountsadddl,07herror:leadx,mess3movah,09hint21hcounts:movah,02hint21h;顯示統(tǒng)計(jì)個(gè)數(shù)exit:movah,4chint21hcodeendscode_1segment;比較子程序assumecs:code_1compareprocfarpushbp;bp進(jìn)棧movbp,sp;棧頂?shù)刂方obpmovsi,[bp+10];字符串的第一個(gè)字符地址給simovcx,[bp+8];將堆棧中字符串長度給cxmovax,[bp+6];將“b"給axxorah,ahagain:cmpal,[si]jnenext incah;統(tǒng)計(jì)b個(gè)數(shù)next:incsiloopagainmoval,ahmov[bp+10],axpopbp;bp出棧ret4compareendpcode_1endsendmain_2運(yùn)行結(jié)果:流程圖:3.請編寫一個(gè)程序來實(shí)現(xiàn)簡單的程序菜單顯示。(采用多模塊程序設(shè)計(jì)方法)顯示一個(gè)菜單要求用戶從下表中選擇:(1) HEXACGAME(對應(yīng)-->程序1)(2) CHARSTATISTICSPROGRAM(對應(yīng)-->程序2)(3) PRESS“ESC”TOQUIT用戶作出選擇1~3時(shí),顯示輸出要執(zhí)行操作的名字,如“Yourselectionis1,theprogramwillexecuteHEXACNUMBERGAME!”然后轉(zhuǎn)向相應(yīng)的程序去執(zhí)行,執(zhí)行結(jié)束前進(jìn)行退出的判斷,顯示一個(gè)提示信息“willyoucontinueprogramreally?(Y:N)”要求用戶從鍵盤鍵入字符,若是“Y”鍵,則繼續(xù)程序的執(zhí)行,若是“N”鍵,則返回到菜單。若用戶選擇3,要求程序顯示提示信息“PleasepressESCkeytoexit!”,并能按要求正確退出。程序代碼:dsegsegmentbufdw53,56,78,45,89,65,32,14,12,75countdb1,2,3,4,5,6,7,8,9,10spacedb',$'tabledb50,?,50dup(?),'$'mess0db0dh,0ah,'error!pleaseinputagain!',0dh,0ah,'$'mess1db'pleaseinputyourstring,overedbypressenter:$',$',0ah,0dh,'$'mess2db0ah,0dh,'timesofthe"b"appearedis:$'mess7db0ah,0dh,'sorry,thecountsofthe"b"havemorethan15,pleasetryagain$'mess3db0dh,0ah,'yourselectionis1,theprogramwillexecutehexacnumber.$',0dh,0ah,'$'mess4db0dh,0ah,'yourselectionis2,theprogramwillexecutecharstatisticsprogram$',0dh,0ah,'$'mess5db0dh,0ah,'pleasepressesckeytoexit!$',0dh,0ahmess6db0dh,0ah,'willyoucontinueprogramreally:(y:n)$',0dh,0ahmenusdb0dh,0ah,'menus:',0dh,0ahdb'(1)hexacgames',0dh,0ah db'(2)charstatisticsprogram',0dh,0ah db'(3)press"esc"toquit',0dh,0ah db'pleaseinput1~3:','$'dsegendscsegsegmentassumecs:cseg,ds:dsegstart:movax,dsegmovds,axleadx,menuscalldisp2movax,0movbx,0movcx,0movdx,0movsi,0movdi,0main:subax,axmovah,01hint21hcmpal,33hjzthreecmpal,32hjztwocmpal,31hjzonejmperrone:leadx,mess3calldisp2again:movbx,buf[si]addsi,2callhexacleadx,spacecalldisp2movdl,count[di];將count首地址單元內(nèi)容給dl來記數(shù)incdicmpdl,10;顯示所有數(shù)后dx為10跳出jesureexitjmpagaintwo:leadx,mess4calldisp2leadx,mess1;顯示mess1,提醒輸入字符calldisp2leadx,tablemovah,0ah;輸入字符串int21hleasi,table;si指向串首址tablemovcl,[si+1]movch,0;cx中為字符串長度incsiincsimoval,'b'movah,0pushsipushcxpushax;參數(shù)送堆棧callcomparepopax;統(tǒng)計(jì)個(gè)數(shù)在al中movcl,alleadx,mess2;顯示mess2,輸出統(tǒng)計(jì)個(gè)數(shù)calldisp2;將個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制movdl,clanddl,0fh adddl,30hcmpdl,39hjlebelowadddl,07hbelow:movah,02hint21h ;顯示統(tǒng)計(jì)個(gè)數(shù)jmpsureexitsureexit:leadx,mess6calldisp2movah,01hint21hcmpal,'n'jeexitcmpal,'y'jestartjmperrthree:leadx,mess5calldisp2movah,01hint21hcmpal,27jeexitjmperrerr:leadx,mess0calldisp2jmpstartexit:movah,4chint21hcseg1segment;比較子程序assumecs:cseg1compareprocfarpushbpmovbp,spmovsi,[bp+10];字符串的第一個(gè)字符地址給simovcx,[bp+8];將堆棧中字符串長度給cxmovax,[bp+6];將“b"給axxorah,ahloop1:cmpal,[si]jnenext incah;統(tǒng)計(jì)b個(gè)數(shù)next:incsilooploop1moval,ahmov[bp+10],axpopbpret4compareendpcseg1endshexacprocnear;二進(jìn)制轉(zhuǎn)換為十六進(jìn)制輸出子程序movch,4rotate:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintitaddal,7hprintit:movdl,alcalldisp1;近調(diào)用disp1decchjnzrotateret;返回doshexacendpdisp1procnear;輸出單個(gè)字符子程序movah,02hint21hretdisp1endpdisp2procnearmovah,09hint21hretdisp2endpcsegendsendstart運(yùn)行結(jié)果:流程圖:三.實(shí)驗(yàn)要求1.第一個(gè)實(shí)驗(yàn)程序用子程序的近程調(diào)用實(shí)現(xiàn)。由于在調(diào)用HEXASC子程序時(shí),子程序又調(diào)用了DISP子程序,這叫子程序的嵌套調(diào)用。實(shí)驗(yàn)過程中可以從堆棧的內(nèi)容看到兩個(gè)子程序的返回地址值。由于是近調(diào)用,地址值只包括返回地址的段內(nèi)偏移量。在每個(gè)子程序的執(zhí)行中,檢查CS值是不變的。2.第二個(gè)程序是利用遠(yuǎn)調(diào)用的方法調(diào)用子程序的。在遠(yuǎn)調(diào)用情況下,主程序與子程序處在不同的邏輯代碼段中,可在子程序執(zhí)行中查看CS值,它與主程序中的CS值是不同的。子程序調(diào)用后,堆棧中保留了返回地址的段地址及段內(nèi)偏移量。3.第二個(gè)程

溫馨提示

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

評論

0/150

提交評論