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

下載本文檔

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

文檔簡介

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

2、確書寫數(shù)據(jù)段,代碼段等。三、實驗內(nèi)容比較兩個字符串string1和string2所含的字符是否相同,如果相同則顯示Match否則顯示No match.請讀程序,并將程序補充完整。DSEG SEGMENT string1 db Move the cursor backward. string2 db Move the cursor backward. mess1 db Match.,13,10,$ mess2 db No match.,13,10,$DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG, es:DSEG, MAIN PROC FAR star

3、t:mov ax, dsegmov ds, axmov es, ax lea si ,string1 cld repz cmpsb jz match lea dx,mess2 jmp short disp match: lea dx,mess1 disp: mov ah,09h int 21h mov ax, 4c00h int 21h MAIN ENDP CSEG ENDSend start實驗步驟:1)用文字編輯工具(記事本或EDIT)將源程序輸入完整后保存在c:masm50下,注意保存時將文件擴展名改為.asm(如lab1.asm)。2)打開桌面的“命令提示符” 程序進入dos命令操作,

4、先用cd masm50 命令改變路經(jīng),接著用 ”masm + 文件名” (如 masm lab1,這里文件名可以不帶擴展名) 對源文件進行匯編,產(chǎn)生.obj文件和.LST文件。若匯編時提示有錯,用文字編輯工具修改源程序后重新匯編,直至通過。3)用 ”link + 文件名” (如 link lab1) 將.obj文件連接成可執(zhí)行的.exe文件(lab1.exe)。4)在DOS狀態(tài)下直接運行l(wèi)ink產(chǎn)生的.exe文件(如 lab1),即在屏幕上顯示Match.5)用debug調試程序,熟悉debug命令的使用:(1)打 debug lab1.exe 進入debug 控制,顯示提示符 _ 。(2)用

5、命令g執(zhí)行程序,可得與步驟4相同的結果,也可用T命令逐條運行這些指令,每運行一行檢查并記錄有關寄存器及IP的變化情況,并注意標志位有無變化。(3)用命令u檢查鍵入的程序并記錄,特別注意左邊的機器碼和指令地址。如果一條u命令沒有顯示完全,可以再次輸入u命令,該命令會緊接著上一個命令的輸出繼續(xù)顯示。(4)用命令g+地址設置斷點,如g06,表示將斷點設置在代碼段的偏移地址為06h的指令前,并執(zhí)行到該斷點前。其中,命令中的地址項可以從上條命令u的運行結果獲得。(5)用命令r查看各寄存器的情況。(6)用命令d0查看數(shù)據(jù)段的情況,0表示從偏移地址0開始,也可以指定其他偏移地址值。(7)用命令 e+地址的方

6、式修改數(shù)據(jù)區(qū)的字符串,其中地址指需要修改的數(shù)據(jù)段內(nèi)存單元偏移地址,可根據(jù)上條d0命令獲得。如e29 表示從偏移地址29h開始修改數(shù)據(jù)。試用此命令將數(shù)據(jù)段變量string1的內(nèi)容修改為Move the cursor forward.(8)再次用命令g執(zhí)行程序,查看執(zhí)行結果。(9)用命令q退出debug,如果在上述步驟中碰到異常,可以先用q命令退出后再進入調試。四、實驗報告或作業(yè)1分析程序,畫出程序流程圖2匯編,連接及調試時產(chǎn)生的錯誤,其原因及解決辦法。3思考:1) 上述實驗中用e修改數(shù)據(jù)段的內(nèi)容,是否改變原文件lab1.asm的內(nèi)容?2) 用單步執(zhí)行命令t運行程序, 運行到mov ax, 4c0

7、0h, int 21h指令后,cs和ip寄存器內(nèi)容前后有何變化,產(chǎn)生變化的原因是什么?附:DEBUG 使用:1打 DEBUG 進入 DEBUG,顯示提示符 _ 。2退出DEBUG命令:Q3顯示內(nèi)存命令:D 起始地址 結束地址4修改內(nèi)存命令:E 起始地址,連續(xù)修改打空格鍵。打回車鍵退出E命令。5檢查寄存器命令:R標志位顯示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPEPODFDNUPIFEIDI6修改寄存器命令:R 寄存器名7小匯編命令:A 起始地址,不輸入指令打回車鍵退出A命令。8反匯編命令:U 起始地址 結束地址9文件命名命令:N 盤號:文件名10讀文件命令:L 內(nèi)

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

9、文件命名命令:N 盤號:文件名10讀文件命令:L 內(nèi)存地址11寫文件命令:W 內(nèi)存地址10讀扇區(qū)命令:L 內(nèi)存地址 盤號(0-A:,1-B:) 扇區(qū)號 扇區(qū)數(shù)11寫扇區(qū)命令:W 內(nèi)存地址 盤號 扇區(qū)號 扇區(qū)數(shù)12運行命令:G=起始地址 結束(斷點)地址13單步命令:T=起始地址 運行指令數(shù),進入子程序內(nèi)部。14單步命令:P=起始地址 運行指令數(shù),不進入子程序內(nèi)部。15內(nèi)存搬家命令:M 起始地址 結束地址 目的地址實驗二 順序程序設計一、預習內(nèi)容1常用工具軟件MASM、LINK和DEBUG的使用2完整程序設計方法的格式3匯編語言順序結構程序的設計方法二、目的要求1繼續(xù)熟悉常用工具軟件MASM、L

10、INK和DEBUG的使用2繼續(xù)熟悉完整程序設計方法的格式3學習與掌握匯編語言順序結構程序的設計方法三、實驗內(nèi)容編程實現(xiàn)datax雙字除以字datay(用div),并且把商存入quotient字單元,把余數(shù)存入remainder字單元(具體數(shù)值可自行確定)。并且用debug查看程序的運行結果,檢查程序運行結果的正確性。DSEG SEGMENT datax dd 956123h datay dw 123hquotient dw ?remainder dw ?DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start:mov ax, dseg mov ds

11、, axmov ax,dataxmov dx,datax2div dataymov quotient,axmov remainder,dxmov ax, 4c00h int 21h CSEG ENDSend start實驗步驟:1用文字編輯工具(記事本或EDIT)將源程序輸入完整后保存在c:masm50下,注意保存時將文件擴展名改為.asm(如lab2.asm)。2用masm對源文件進行匯編,產(chǎn)生.obj(如lab2.obj)文件和.LST文件。若匯編時提示有錯,用文字編輯工具修改源程序后重新匯編,直至通過。3用 link將.obj文件連接成可執(zhí)行的.exe文件(lab2.exe)。4直接運行

12、link產(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的結果記錄。4步驟6的結果記錄,并分析發(fā)生變化的原因。5思考:1) 指令mov dx,datax2 改寫成 mov dx,datax+2 經(jīng)過匯編后,二者是否相同,

13、為什么?2) 如何實現(xiàn)雙字datax 與字datay的乘法,寫出完整的源程序。實驗三 循環(huán)程序設計一、預習內(nèi)容1多重循環(huán)程序和排序程序設計方法。2帶符號數(shù)的比較轉移指令:JL,JLE,JG,JGE二、目的要求1掌握多重循環(huán)程序和排序程序設計方法。2掌握帶符號數(shù)的比較轉移指令:JL,JLE,JG,JGE三、實驗內(nèi)容建立學生名次表,以grade為首地址的數(shù)組中保存了學生的成績,其中 grade+i 保存學號為i+1的學生的成績。要求建立一個10個字的rank數(shù)組,并根據(jù)grade中的學生成績將學生名次填入rank數(shù)組中,其中rank+i的內(nèi)容是學號為i+1學生的名次(提示:一個學生的名次等于成績高

14、于該學生的人數(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 start: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 EN

15、DSend start實驗步驟:1輸入,匯編并連接此程序。2在DEBUG下運行此程序,記錄運行結果。3將轉移指令JGE改為JG,JL,JLE分別運行記錄排序結果,察看結果是否正確不對,并分析原因。四、實驗報告或作業(yè)1分析程序,畫出程序流程圖2匯編,連接及調試時產(chǎn)生的錯誤,其原因及解決辦法。3記錄JGE情況下的排序結果,同時比較將轉移指令JGE改為JG,JL,JLE 時的排序結果,并分析結果正確與否,如果不正確,寫出原因和解決辦法。4思考:如果想外循環(huán)也用loop實現(xiàn),應該怎樣修改程序?實驗四 分支程序設計一、預習內(nèi)容1分支程序設計方法。2利用轉移指令jl、jmp實現(xiàn)多岔分支的方法。二、目的要求

16、1掌握分支程序設計方法。2掌握利用轉移指令jl、jmp實現(xiàn)多岔分支的方法。三、實驗內(nèi)容統(tǒng)計學生成績result。設有10個學生的成績分別為56、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 c

17、s:CSEG, ds:DSEG start:mov ax, dseg mov ds, axmov cx,10mov bx,offset gradecompare: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_

18、addrfive:inc s5change_addr: mov ax, 4c00h int 21h CSEG ENDSend start實驗步驟: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?實驗五 子

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

20、從終端顯示出來。源程序如下,模塊層次如圖所示,源程序已經(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 far start : mov ax, data mov ds, ax call input cal

21、l 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 enter error: lea dx,mess2 mov ah,09 int 21h exit2

22、: 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 loop1 ret rankp endpoutput proc near lea dx,mess3 mov

23、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 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

24、_div pop di ; pop si ; pop cx ; pop bx ; retbinidec endp dec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al add dl,30h mov ah,02h int 21h retdec_div endpcrlf proc near crlf endpend main三、實驗步驟1認真閱讀程序,自己編寫十進制到二進制轉換子程序decibin和輸出回車換行子程序crlf,將程序補充完整,然后匯編、鏈接、生成可執(zhí)行文件。2用DEBUG的斷點命令和T命令運行此程序,觀察并記

25、錄每次過程調用和進出棧指令前后(帶;的語句)的SP和堆棧內(nèi)容,如記錄執(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ū)域的示意圖。5記錄最后的輸出結果。6思考: 如果想用堆棧傳遞參數(shù),源程序應做何修改?實驗六 I/O程序設計一、預習

26、內(nèi)容1程序直接控制I/O方式。2I/O程序設計方法。3子程序設計方法二、目的要求1掌握程序直接控制I/O方式。2熟悉I/O程序設計方法。3繼續(xù)熟悉子程序設計方法。三、實驗內(nèi)容用位觸發(fā)方式(也即程序直接控制輸出控制寄存器(I/O端口為61hhh )的第一位,使該位按所需要的頻率進行1和0的交替變化,從而控制開關電路產(chǎn)生一串脈沖波形,這些脈沖經(jīng)放大后驅動揚聲器發(fā)聲音)模擬槍響程序。程序如下,但其中有些語句錯誤,需要修改后才能正確運行。code segmentmain proc farassume cs:codestart: mov cx,50d new_short: push cx call sh

27、oot 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 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認真閱

溫馨提示

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

評論

0/150

提交評論