《匯編語言》實驗講義_第1頁
《匯編語言》實驗講義_第2頁
《匯編語言》實驗講義_第3頁
《匯編語言》實驗講義_第4頁
《匯編語言》實驗講義_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 匯編語言程序設計實驗指導書匯編語言程序設計實驗指導書計算機系 宋勤 2013-5匯編語言實驗學時分配表序號實驗項目名稱實驗學時實驗報告或作業(yè)課內課外1匯編語言程序上機過程以及調試2212順序程序設計2213循環(huán)程序設計2214分支程序設計2215子程序設計2216I/O程序設計2217實驗七 綜合程序設計程序設計221合計14147實驗一匯編語言程序上機過程以及調試一、預習內容1.工具軟件MASM、LINK的使用2.常用DEBUG命令的使用: G,D,R,T,U,Q3.完整程序設計方法的格式。二、目的要求1.掌握常用工具軟件MASM、LINK的使用2.掌握常用DEBUG命令: G,D,R,T

2、,U,Q 能靈活使用這些命令調試程序3.掌握完整程序設計方法的格式,能正確書寫數(shù)據(jù)段,代碼段等。三、實驗內容用兩種方法把字符串mess1復制到mess2串中去;(1) 從左到右的方向復制(2) 從右到左的方向復制data segment mess1 db my name is songqin $data endsEXTRA segment mess2 db 17 dup(?)EXTRA ends;*code segment assume cs:code, DS:DATA, ES:EXTRA start: mov ax,DATA MOV ds,ax mov ax,EXTRA MOV es,ax

3、leA si,mess1 leA di,mess2 mov cx,017 CLD rep movsB ret code ends end start 實驗步驟:1)用文字編輯工具(記事本或EDIT)將源程序輸入完整后保存在D:masm50下,注意保存時將文件擴展名改為.asm(如P77.asm)。2)打開桌面的“命令提示符” 程序進入dos命令操作,先用cd masm50 命令改變路經(jīng),接著用 ”masm + 文件名” (如 masm P77,這里文件名可以不帶擴展名) 對源文件進行匯編,產(chǎn)生.obj文件和.LST文件。若匯編時提示有錯,用文字編輯工具修改源程序后重新匯編,直至通過。3)用 ”

4、link + 文件名” (如 link P77;) 將.obj文件連接成可執(zhí)行的.exe文件(P77.exe)。4)用debug調試程序,熟悉debug命令的使用:(1)打 debug P77.exe 進入debug 控制,顯示提示符 - 。(2)用命令g執(zhí)行程序,可得與步驟4相同的結果,也可用T命令逐條運行這些指令,每運行一行檢查并記錄有關寄存器及IP的變化情況,并注意標志位有無變化。(3)用命令u檢查鍵入的程序并記錄,特別注意左邊的機器碼和指令地址。如果一條u命令沒有顯示完全,可以再次輸入u命令,該命令會緊接著上一個命令的輸出繼續(xù)顯示。(4)用命令g+地址設置斷點,如g06,表示將斷點設置

5、在代碼段的偏移地址為06h的指令前,并執(zhí)行到該斷點前。其中,命令中的地址項可以從上條命令u的運行結果獲得。(5)用命令r查看各寄存器的情況。(6)用命令d0查看數(shù)據(jù)段的情況,0表示從偏移地址0開始,也可以指定其他偏移地址值。(7)用命令 e+地址的方式修改數(shù)據(jù)區(qū)的字符串,其中地址指需要修改的數(shù)據(jù)段內存單元偏移地址,可根據(jù)上條d0命令獲得。如e 09 表示從偏移地址09h開始修改數(shù)據(jù)。(8)再次用命令g執(zhí)行程序,查看執(zhí)行結果。(9)用命令q退出debug,如果在上述步驟中碰到異常,可以先用q命令退出后再進入調試。四、實驗報告或作業(yè)1分析程序,畫出程序流程圖2匯編,連接及調試時產(chǎn)生的錯誤,其原因及

6、解決辦法。3思考:1) 上述實驗中用e修改數(shù)據(jù)段的內容,是否改變原文件P77.asm的內容?2) 用單步執(zhí)行命令t運行程序, 運行到mov ax, 4c00h, int 21h指令后,cs和ip寄存器內容前后有何變化,產(chǎn)生變化的原因是什么?附:DEBUG 使用:1打 DEBUG 進入 DEBUG,顯示提示符 - 。2退出DEBUG命令:Q3顯示內存命令:D 起始地址 結束地址4修改內存命令:E 起始地址,連續(xù)修改打空格鍵。打回車鍵退出E命令。5檢查寄存器命令:R標志位顯示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPEPODFDNUPIFEIDI6修改寄存器命令:R 寄

7、存器名7小匯編命令:A 起始地址,不輸入指令打回車鍵退出A命令。8反匯編命令:U 起始地址 結束地址9文件命名命令:N 盤號:文件名10讀文件命令:L 內存地址11寫文件命令:W 內存地址10讀扇區(qū)命令:L 內存地址 盤號(0-A:,1-B:) 扇區(qū)號 扇區(qū)數(shù)11寫扇區(qū)命令:W 內存地址 盤號 扇區(qū)號 扇區(qū)數(shù)12運行命令:G=起始地址 結束(斷點)地址13單步命令:T=起始地址 運行指令數(shù),進入子程序內部。14單步命令:P=起始地址 運行指令數(shù),不進入子程序內部。15內存搬家命令:M 起始地址 結束地址 目的地址標志位顯示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPE

8、PODFDNUPIFEIDI6修改寄存器命令:R 寄存器名7小匯編命令:A 起始地址,不輸入指令打回車鍵退出A命令。8反匯編命令:U 起始地址 結束地址9文件命名命令:N 盤號:文件名10讀文件命令:L 內存地址11寫文件命令:W 內存地址10讀扇區(qū)命令:L 內存地址 盤號(0-A:,1-B:) 扇區(qū)號 扇區(qū)數(shù)11寫扇區(qū)命令:W 內存地址 盤號 扇區(qū)號 扇區(qū)數(shù)12運行命令:G=起始地址 結束(斷點)地址13單步命令:T=起始地址 運行指令數(shù),進入子程序內部。14單步命令:P=起始地址 運行指令數(shù),不進入子程序內部。15內存搬家命令:M 起始地址 結束地址 目的地址實驗二 順序程序設計一、預習內

9、容1常用工具軟件MASM、LINK和DEBUG的使用2完整程序設計方法的格式3匯編語言順序結構程序的設計方法二、目的要求1繼續(xù)熟悉常用工具軟件MASM、LINK和DEBUG的使用2繼續(xù)熟悉完整程序設計方法的格式3學習與掌握匯編語言順序結構程序的設計方法三、實驗內容編程實現(xiàn)datax雙字除以字datay(用div),并且把商存入quotient字單元,把余數(shù)存入remainder字單元(具體數(shù)值可自行確定)。并且用debug查看程序的運行結果,檢查程序運行結果的正確性。DSEG SEGMENT datax dd 956123h datay dw 123hquotient dw ?remainde

10、r dw ?DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start:mov ax, dseg mov ds, axmov ax,dataxmov dx,datax2div dataymov quotient,axmov remainder,dxmov ax, 4c00h int 21h CSEG ENDSend start實驗步驟:1用文字編輯工具(記事本或EDIT)將源程序輸入完整后保存在D:masm50下,注意保存時將文件擴展名改為.asm(如lab2.asm)。2用masm對源文件進行匯編,產(chǎn)生.obj(如lab2.obj)文件和.LST文

11、件。若匯編時提示有錯,用文字編輯工具修改源程序后重新匯編,直至通過。3用 link將.obj文件連接成可執(zhí)行的.exe文件(lab2.exe)。4直接運行l(wèi)ink產(chǎn)生的.exe文件。5用debug調試程序,單步執(zhí)行程序,并記錄黑體部分單步執(zhí)行后ax,dx,cs,ip寄存器以及標志寄存器的值.6在debug狀態(tài)下,用“a+偏移地址”的方式將程序的div 改為idiv再單步執(zhí)行黑體部分,對比步驟5的結果,查看有何變化,并記錄。7修改源程序實現(xiàn)雙字datax 與字datay的無符號乘法。四、實驗報告或作業(yè)1分析程序,畫出程序流程圖。2匯編,連接及調試時產(chǎn)生的錯誤,其原因及解決辦法。3步驟5的結果記錄

12、。4步驟6的結果記錄,并分析發(fā)生變化的原因。5思考:1) 指令mov dx,datax2 改寫成 mov dx,datax+2 經(jīng)過匯編后,二者是否相同,為什么?2) 如何實現(xiàn)雙字datax 與字datay的乘法,寫出完整的源程序。實驗三 循環(huán)程序設計A-A實驗A (必做)一、 實驗目的:1 掌握循環(huán)程序的設計方法2 進一步熟悉利用DEBUG程序修改參數(shù)的方法,并檢查和驗證結果的正確性。3 學會針對不同的問題,選用不同的組織循環(huán)的方法。二、 實驗內容1 編寫一個程序,用二進制顯示從鍵盤輸入一個字符的ASCII碼。2 編寫一個程序,記錄某個字存儲單元數(shù)據(jù)中1的個數(shù),以十進制形式顯示結果。 三、

13、實驗準備1 編寫實驗內容要求的兩個程序。2 寫出調試以上程序,即修改程序參數(shù),檢查結果的操作方法。3 熟悉源程序匯編、連接命令的使用方法即要回答的內容。四、 實驗步驟1 用EDIT或其它編輯軟件,編寫.ASM源程序,例如Binary.ASM及Statistic.ASM。2 對其進行匯編及連接,產(chǎn)生.EXE文件。3 對.EXE文件進行調試運行。a. 用DEBUG調試運行,學會修改AL內容的方法。b. 對DSPKEY.EXE鍵入不同的字符,分別進行調試。c. 在MS-DOS下運行這兩個.EXE文件。五、 實驗報告要求 畫出兩個程序的流程圖,若要獨立編寫程序,應列出相應的程序清單。六、 參考程序段清

14、單:;Binary.asmmov cx,8;CX8(循環(huán)次數(shù))again:shl bl,1;左移進CF,從高位開始顯示mov dl,0;MOV指令不改變CFadc dl,30h;DL030HCF;CF若是0,則DL 0 ;CF若是1,則DL 1 mov ah,2int 21h;顯示loop again;CX減1,如果CX未減至0,則循環(huán);Statistic.ASM;數(shù)據(jù)段numberdw 1110111111100100B;代碼段mov bx,numberxor dl,dl;循環(huán)初值:DL0again:test bx,0ffffh;也可以用cmp bx,0jz done;全部是0就可以退出循環(huán)

15、,減少循環(huán)次數(shù)shl bx,1;用指令shr bx,1也可以adc dl,0;利用ADC指令加CF的特點進行計數(shù)jmp againdone:cmp dl,10;判斷1的個數(shù)是否小于10jb digit;1的個數(shù)小于10,轉移push dxmov dl,1;1的個數(shù)大于或等于10mov ah,2;則要先顯示一個1int 21hpop dxsub dl,10digit:add dl,0;顯示個數(shù)mov ah,2int 21hA-ABB實驗 B一、預習內容1多重循環(huán)程序和排序程序設計方法。2帶符號數(shù)的比較轉移指令:JL,JLE,JG,JGE二、目的要求1掌握多重循環(huán)程序和排序程序設計方法。2掌握帶符

16、號數(shù)的比較轉移指令:JL,JLE,JG,JGE三、實驗內容建立學生名次表,以grade為首地址的數(shù)組中保存了學生的成績,其中 grade+i 保存學號為i+1的學生的成績。要求建立一個10個字的rank數(shù)組,并根據(jù)grade中的學生成績將學生名次填入rank數(shù)組中,其中rank+i的內容是學號為i+1學生的名次(提示:一個學生的名次等于成績高于該學生的人數(shù)加1)DSEG SEGMENT grade dw 88,75,95,63,98,78,87,78,90,60 rank dw 10 dup(?)DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG sta

17、rt:mov ax, dseg mov ds, axmov di,10mov bx,0loop: mov dx,1mov cx,10 next:cmp ax,sijge no_countinc dxno_count:add si,2loop next add bx,2 jne loopmov ax, 4c00h int 21h CSEG ENDSend start實驗步驟:1輸入,匯編并連接此程序。2在DEBUG下運行此程序,記錄運行結果。3將轉移指令JGE改為JG,JL,JLE分別運行記錄排序結果,察看結果是否正確不對,并分析原因。四、實驗報告或作業(yè)1分析程序,畫出程序流程圖2匯編,連接及調

18、試時產(chǎn)生的錯誤,其原因及解決辦法。3記錄JGE情況下的排序結果,同時比較將轉移指令JGE改為JG,JL,JLE 時的排序結果,并分析結果正確與否,如果不正確,寫出原因和解決辦法。4思考:如果想外循環(huán)也用loop實現(xiàn),應該怎樣修改程序?BB實驗四 分支程序設計A-A實驗A (必做)一、 實驗目的:1 掌握分支程序的設計方法2 掌握利用DEBUG修改參數(shù)、檢查結果的方法。3 掌握匯編語言源程序的編輯、匯編、連接及調試過程。二、 實驗內容1 編寫一個程序,顯示AL寄存器中的兩位十六進制數(shù)2 編寫一個程序,判別鍵盤上輸入的字符;若是1-9字符,則顯示之;若為A-Z或a-z字符,均顯示“c”;若是回車字

19、符(其ASCII碼為0DH),則結束程序,若為其它字符則不顯示,繼續(xù)等待新的字符輸入。三、 實驗準備1 編寫實驗內容要求的兩個程序。2 寫出調試以上程序,即修改程序參數(shù),檢查結果的操作方法。3 熟悉源程序匯編、連接命令的使用方法即要回答的內容。四、 實驗步驟1 用EDIT或其它編輯軟件,編寫.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。2 對其進行匯編及連接,產(chǎn)生.EXE文件。3 對.EXE文件進行調試運行。a. 用DEBUG調試運行,學會修改AL內容的方法。b. 對DSPKEY.EXE鍵入不同的字符,分別進行調試。c. 在MS-DOS下運行這兩個.EXE文件。五、 實驗報告

20、要求 畫出兩個程序的流程圖,若要獨立編寫程序,應列出相應的程序清單。六、 參考程序清單 (1) 顯示AL中兩位十六進制數(shù)程序:;DISPHEX.ASMCODE SEGMENT ASSUME CS:CODESTART: MOV AL,3EH MOV BL,AL MOV DL,AL MOV CL,4 SHR DL,CL CMP DL,9 JBE NEXT1 ADD DL,7NEXT1: ADD DL,30H MOV AH,2 INT 21H ;顯示高位ASCII碼 MOV DL,BL AND DL,0FH CMP DL,9 JBE NEXT2 ADD DL,7NEXT2: ADD DL,30H M

21、OV AH,2V AH,2 INT 21H ;顯示低位ASCII碼 MOV AH,4CH INT 21HCODE ENDS ;返回DOS END START(2) 顯示鍵入字符程序;DISPKEY.ASMCODE SEGEMENT ASSUME CS:CODESTART: MOV AH,1 INT 21H ;等待鍵入字符,送AL CMP AL,0DH ;是否是回車符? JZ DONE ;是則轉DONE退出程序 CMP AL,0 JB NEXT CMP AL,9 JA CHARUP MOV DL,AL MOV AH,2 INT 21H JMP STARTCHARUP: CMP AL,41H JB

22、 NEXT CMP AL,5AH JA CHRDNDISPC: MOV DL,C MOV AH,2 INT 21HNEXT: JMP STARTCHRDN: CMP AL,61H JB NEXT CMP AL,7AH JA NEXT JMP DISPCDONE: MOV AH,4CH INT 21HCODE: ENDS END STARTA-ABB實驗B (選做)一、預習內容1分支程序設計方法。2利用轉移指令jl、jmp實現(xiàn)多岔分支的方法。二、目的要求1掌握分支程序設計方法。2掌握利用轉移指令jl、jmp實現(xiàn)多岔分支的方法。三、實驗內容統(tǒng)計學生成績result。設有10個學生的成績分別為56、

23、69、84、82、73、88、99、63、100和80分。試編制程序分別統(tǒng)計低于60分、6069分、7079分、8089分、9099分及100分的人數(shù),并分別存放到s5、s6、s7、s8、s9及s10單元中DSEG SEGMENT grade dw 56,69,84,82,73,88,99,63,100,80s5 dw 0s6 dw 0s7 dw 0s8 dw 0s9 dw 0s10 dw 0DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start:mov ax, dseg mov ds, axmov cx,10mov bx,offset grad

24、ecompare:mov ax, bxcmp ax,60jl fivecmp ax,70jl sixcmp ax,80jl sevencmp ax,90jl eightcmp ax,100jne nine nine:inc s9jmp short change_addreight:inc s8jmp short change_addrseven:inc s7jmp short change_addrsix:inc s6jmp short change_addrfive:inc s5change_addr: mov ax, 4c00h int 21h CSEG ENDSend start實驗步驟

25、:1閱讀程序,將程序補充完整。2輸入,匯編并連接此程序。3在DEBUG下運行此程序,記錄運行結果。4單步運行程序,記錄前五次執(zhí)行轉移指令后寄存器cs ip的值。四、實驗報告或作業(yè)1分析程序,畫出程序流程圖。2匯編,連接及調試時產(chǎn)生的錯誤,其原因及解決辦法。3每次執(zhí)行轉移指令時寄存器cs ip的值。4、最終運行結果,即s5、s6、s7、s8、s9及s10的值。5、思考:如何修改程序使源程序先統(tǒng)計s10,然后依次統(tǒng)計s9,s8,s7,s6,s5?BB實驗五 子程序設計A-A實驗A(必做)本實驗的目的在于讓讀者掌握同一模塊調用的方法。一、 實驗目的1 掌握主程序與子程序之間的調用關系及調用方法。2

26、掌握子程序調用過程中近程調用與遠程調用的區(qū)別。3 掌握通過堆棧轉送參數(shù)的方法。二、 實驗內容1 將BUF開始的10個單元中的二進制數(shù)轉換成兩位十六進制數(shù)的ASCII碼,在屏幕上顯示出來。要求碼型轉換通過子程序HEXAC實現(xiàn),在轉換過程中,通過子程序DISP實現(xiàn)顯示.2 編寫一個主程序,從鍵盤接收若干個字符,然后用遠調用的方法,調用子程序統(tǒng)計字符串中字符b的個數(shù).子程序的參數(shù)是字符串的首地址TABLE,字符串長度N及字符”b”.子程序返回字符b”的個數(shù).參數(shù)傳送采用堆棧實現(xiàn).主程序在子程序返回后,顯示字符”b”及其個數(shù)(設為一位十六進制數(shù)).三、 實驗說明1 第一個實驗程序用子程序的近程調用實現(xiàn)

27、。由于在調用HEXASC子程序時,子程序又調用了DISP子程序,這叫子程序的嵌套調用。實驗過程中可以從堆棧的內容看到兩個子程序的返回地址值。由于是近調用,地址值只包括返回地址的段內偏移量。在每個子程序的執(zhí)行中,檢查CS值是不變的。2 第二個程序是利用遠調用的方法調用子程序的。在遠調用情況下,主程序與子程序處在不同的邏輯代碼段中,可在子程序執(zhí)行中查看CS值,它與主程序中的CS值是不同的。子程序調用后,堆棧中保留了返回地址的段地址及段內偏移量。3 第二個程序中,主程序與子程序之間參數(shù)的傳送是由堆棧實現(xiàn)的。一段是將參數(shù)(此處是串首址TABLE,串的長度N及待統(tǒng)計的字符“b”)順序壓如堆棧,在子程序調

28、用后,通過BP指針對堆棧中的參數(shù)訪問,并將統(tǒng)計的結果通過堆棧返回。有關該方法的原理此處不再介紹。四、 實驗準備1 預習子程序設計的基本方法,根據(jù)實驗內容要求,畫出子程序及主程序的流程圖。2 熟悉鍵盤鍵入字符串及用堆棧傳送參數(shù)的程序段編制方法。五、 實驗步驟1 編輯、匯編兩個源程序,生成相應的可執(zhí)行文件(。EXE)2 用DEBUG的R 命令,T 命令或G命令和D命令檢查遠程調用及近程調用時堆棧的變化。特別是通過堆棧傳送的參數(shù)和子程序取出的參數(shù)是返回參數(shù)的詳細過程。3 檢查程序執(zhí)行的結果是否正確。六、 實驗報告要求 1 分析遠程調用與近程調用的區(qū)別,在用DEBUG有關命令觀察時,執(zhí)行過程有何不同。

29、2 說明用堆棧傳送參數(shù)的過程及其具體方法。3 分析實驗結果及所遇到問題,并說明解決的方法。七、參考程序清單 (1) 碼型轉換程序清單:;CONV.ASNDATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH,6FHDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,10 LEA BX,BUFAGAIN: MOV AL, BX CALL HEXASC INC BX LOOP AGAIN MOV AH,4CH INT 21HHE

30、XASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXCALL DISP ;顯示高位HEX數(shù)MOV DL,ALAND DL,0FHCALL DISPRETHEXASC ENDPDISP PROP CMP DL,9 JBE NEXT ADD DL,7NEXT: ADD DL,30H MOV AH,2 INT 21H ;顯示 RET DISP ENDPCODE ENDS END START(2)統(tǒng)計并顯示某鍵入字符的個數(shù)的程序: :COUNTER.ASMDATA SEGMENTCHAR DB bBUF DB 50H, ? 50H DUP(?)DA

31、TA ENDS MCODE SEGMENT ASSUME CS: MCODE, DS: DATASTART: MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,9 INT 21H LEA SI BUF MOV CL, SI+1 MOV CH, 0 ;CX中為字符串長度 INC SI INC SI ;SI指向串首址TABLE MOV AL,CHAR MOV AH,0 ;AX中為待查字符 PUSH SI PUSH CX PUSH AX ; 參數(shù)送堆棧CALL CHECKPOP AX :統(tǒng)計個數(shù)在AL中 MOV DL,CHAR MOV AH,2 INT 21H MOV

32、DL,AL AND DL, 0FH CMP DL,9 JBE NEXT ADD DL,7NEXT: ADD DL,30H MOV AH,2 INT 21H ;顯示統(tǒng)計個數(shù) MOV AH,4CH INT 21HM CODE ENDSSCODE SEGMENT ASSUME CS:SCODECHECK PROC FAR PUSH BP MOV BP,SP MOV SI,BP+10 MOV CX, BP+8 MOV AX, BP+6 XOR AH, AHAGAIN: CMP AL.SI JNE NEXT1 INC AHNEXT1: INC SI LOOP AGAIN MOV AL, AH MOV B

33、P+10,AX POP BP RET 4CHECK ENDP END STARTA-ABB實驗B 子程序設計一、預習內容1子程序調用方法和參數(shù)傳遞方式。2過程調用偽指令: PROC,ENDP和NEAR。3子程序調用中堆棧的用法。4簡化格式程序設計方法。二、目的要求1掌握子程序調用方法和參數(shù)傳遞方式。2掌握過程調用偽指令: PROC,ENDP和NEAR。3理解子程序調用中堆棧的用法。4熟悉簡化格式程序設計方法。三、實驗內容顯示學生名次表rank。要求接收從鍵盤輸入的一個班的學生成績,并存放于10字的grade數(shù)組中,其中grade+i保存學號為i+1的學生的成績。然后根據(jù)grade中的學生成績,

34、把學生名次填入10字的rank數(shù)組中,其中rank+i的內容是學號為i+1學生的名次。再按學號把名次從終端顯示出來。源程序如下,模塊層次如圖所示,源程序已經(jīng)完成了mian, input, rankp, output, bindec和dec_div模塊的編寫,模塊decbin和crlf需要自己完成。.model small.stack.data grade dw 10 dup(?)rank dw 10 dup(?)count dw ?mess1 db Grade?,$mess2 db 13,10,Iput Error!,13,10,$mess3 db Rank:,$.codemain proc

35、far start : mov ax, data mov ds, ax call input call rankp call output mov ax, 4c00h int 21hmain endpinput proc near mov dx,offset mess1 mov ah,09 int 21h mov si,0 mov count,0 enter: call decibin inc count cmp dl, je store cmp dl,13 ;is it return? je exit2 jne error store: mov gradesi,bx add si,2 jmp

36、 enter error: lea dx,mess2 mov ah,09 int 21h exit2: mov gradesi,bx call crlf ret input endprankp proc near mov di,count mov bx,0 loop1: mov ax,gradebx mov word ptr rankbx,0 mov cx,count lea si,grade next: cmp ax,si jg no_count inc word ptr rankbx no_count: add si,2 loop next add bx,2 dec di jne loop

37、1 ret rankp endpoutput proc near lea dx,mess3 mov ah,09 int 21h mov si,0 mov di,countnext1: mov bx,ranksi call binidec mov dl, mov ah,02 int 21h add si,2 dec di jnz next1 call crlf ret output endpdecibin proc near dec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al add dl,30h mov ah,02h

38、int 21h retdec_div endpcrlf proc near。crlf endpend main decibin endpbinidec proc near push bx ; push cx ; push si ; push di ; mov cx,100d call dec_div mov cx,10d call dec_div mov cx,1 call dec_div pop di ; pop si ; pop cx ; pop bx ; retbinidec endp 四、實驗步驟1認真閱讀程序,自己編寫十進制到二進制轉換子程序decibin和輸出回車換行子程序crlf

39、,將程序補充完整,然后匯編、鏈接、生成可執(zhí)行文件。2用DEBUG的斷點命令和T命令運行此程序,觀察并記錄每次過程調用和進出棧指令前后(帶;的語句)的SP和堆棧內容,如記錄執(zhí)行call input,call rankp,call output三條指令后sp,bp以及sp的值。3記錄數(shù)據(jù)段各變量的最后結果。五、實驗報告或作業(yè)1畫出input,output和rankp模塊的流程圖。2匯編,連接及調試時產(chǎn)生的錯誤,其原因及解決辦法。3記錄執(zhí)行call input ,call rankp,call output三條指令后sp,bp以及sp的值,并指出sp指向哪條指令。4畫出堆棧滿時堆棧存儲區(qū)域的示意圖。

40、5記錄最后的輸出結果。6思考: 如果想用堆棧傳遞參數(shù),源程序應做何修改?BB實驗六 I/O程序設計A-A實驗A 一、預習內容1程序直接控制I/O方式。2I/O程序設計方法。3子程序設計方法二、目的要求1掌握程序直接控制I/O方式。2熟悉I/O程序設計方法。3繼續(xù)熟悉子程序設計方法。三、實驗內容用位觸發(fā)方式(也即程序直接控制輸出控制寄存器(I/O端口為61hhh )的第一位,使該位按所需要的頻率進行1和0的交替變化,從而控制開關電路產(chǎn)生一串脈沖波形,這些脈沖經(jīng)放大后驅動揚聲器發(fā)聲音)模擬槍響程序。程序如下,但其中有些語句錯誤,需要修改后才能正確運行。code segmentmain proc f

41、arassume cs:codestart: mov cx,50d new_short: push cx call shoot mov cx,0f000h silent: loop silent pop cx loop new_short mov al,48h out 61h,al mov ax,4c00h int 21hmain endp shoot proc near mov dx,140h mov bx,20h in al,61h and al,11111100b sound: xor al,2 out 61h,al add dx,9248h mov cl,3 ror dx,cl mov

42、 cx,dx and cx,1ffh or cx,1000hdelay: push cxwait: loop wait pop cx loop delay dec bx jnz sound and al,11111100b out 61h,al retshoot endpcode endsend start實驗步驟1認真閱讀程序,將源程序中的錯誤找出后修改。2編譯,鏈接,生成可執(zhí)行文件,記錄編譯過程中的錯誤,并分析原因。3執(zhí)行程序,調式程序,直到可以清楚聽到槍響的聲音。四、實驗報告或作業(yè)1分析程序,畫出程序流程圖。2匯編,連接及調試時產(chǎn)生的錯誤,其原因及解決辦法。3思考:試將程序中的黑體部分修改為 wait: loop wait,再編譯運行程序,是否能聽到槍聲,為什么?A-ABB實驗B (選做)一、實驗目的 1掌握輸入輸出程序設計的概念和方法。 2了解PC機外圍芯片8255、8259的功能。 3學習如何在PC機上編寫具有輸入輸出功能的程序,包括8255、8259芯片的使用方法二、實驗說明 本實驗要求自行編寫一個鍵盤輸入處理程序,它可以完成鍵盤字符的讀入并進行屏幕顯示,本實驗要利用IBMPC系統(tǒng)的

溫馨提示

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

評論

0/150

提交評論