匯編實驗五--DOS功能調(diào)用_第1頁
匯編實驗五--DOS功能調(diào)用_第2頁
匯編實驗五--DOS功能調(diào)用_第3頁
匯編實驗五--DOS功能調(diào)用_第4頁
匯編實驗五--DOS功能調(diào)用_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、福建農(nóng)林大學(xué)東方學(xué)院信息工程類實驗報告系: 計算機系 專業(yè): 電子信息工程 年級: 10 姓名: 廖少兵 學(xué)號: 1050302103 實驗課程: 匯編語言 實驗室號:_ 實驗設(shè)備號: 實驗時間: 指導(dǎo)教師簽字: 成績: 實驗五 DOS功能調(diào)用1實驗?zāi)康暮鸵?. 學(xué)會DOS中關(guān)于顯示功能調(diào)用指令的用法。2. 領(lǐng)會修改顯存方法顯示字符。2實驗用的軟硬件環(huán)境實驗的硬件環(huán)境是:IBMPC機及其兼容機實驗的軟件環(huán)境是: 操作系統(tǒng):DOS 2.0以上;調(diào)試程序:DEBUG.COM;文本編程程序:EDIT.EXE、WPS.EXE;宏匯編程序:MASM.EXE(或ASM .EXE);連接裝配程序:LINK

2、 .EXE;交叉引用程序:CREF.EXE(可有可無)。3實驗內(nèi)容及實驗數(shù)據(jù)記錄1、 輸入一個字符,顯示出來2、 輸入一個字符串,顯示出來3、 buf開始的3個的16位二進制數(shù)用十六進制數(shù)的形式顯示出來(1)理解程序(2)輸入程序,匯編,運行(在DOS狀態(tài)下輸入:文件名.EXE),觀察結(jié)果。(3)如果要分行顯示,程序要如何修改?DATASEGMENTBUFDW4F59H, 56A8H, 0FF90HDATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATA MOVDS, AX MOVSI, 0P:MOVBX, BUFSI MOVCH

3、, 4L:MOVCL, 4 ROLBX, CL MOVDL, BL ANDDL, 0FH CMPDL, 10 JBNEXT ADDDL, 7NEXT:ADDDL, 30H MOVAH, 2 INT21H DECCH JNZL INCSI INCSI CMPSI, 4 JNAP MOVAH, 4CH INT21HCODE ENDSENDSTART4、 運行下列程序,在屏幕的第1行,會顯示一個字符X,理解程序段STACK SEGMENT DB 128 DUP(0)STACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACKSTART: MOV AX,STACK MO

4、V SS,AX MOV SP,128 MOV AX,0B800H MOV ES,AX MOV AH,0 ;BIOS 10H的0號功能,設(shè)置80X25的彩色字符模式 MOV AL,03H INT 10H MOV AH,X MOV ES:160*1+40*2,AH MOV AL,0 MOV AH,4CH INT 21HCODE ENDS END START5、 顯示*6、 編寫程序,統(tǒng)計字緩沖區(qū)中的20個數(shù)據(jù)的正數(shù)、負(fù)數(shù)、0的個數(shù),并將統(tǒng)計結(jié)果以16進制形式顯示出來。4操作方法及實驗步驟1)直接調(diào)用DOS 1號功能即可,debug環(huán)境中a命令直接編輯代碼寫入內(nèi)存如下指令MOVAH,01INT21H

5、MOVAH,4CINT21H2)字符串的輸入和顯示,原以為在調(diào)用10號功能后需要調(diào)用9號顯示功能,因此編輯代碼如下DATA SEGMENTBUF DB 10 DB ?DB 10 DUP(?);DB $DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AXMOV DX,OFFSET BUFMOV AH,10INT 21H;MOV DX,OFFSET BUF+2;MOV AH,9;INT 21HMOV AH,4CHINT 21HCODE ENDSEND START3)3.1&3.2我們知道要將數(shù)以16進制的形式顯示就

6、必須找到其對應(yīng)的字母ABCDEF的ASCII碼,ASCII碼48是數(shù)字0的開始也就是16進制中的30,而3AH開始至40H為7個常用符號的ASCII碼值,從41H開始才是大寫字母的ASCII碼值,因此將所要轉(zhuǎn)化的四位二進制數(shù)與10做比較,若小于10可直接加30H得到其對應(yīng)的ASCII碼,若大于等于10則應(yīng)多加上7跳過7個符號ASCII碼得到其對應(yīng)的16進制ASCII碼以達到轉(zhuǎn)換的目的即顯示時打印其相應(yīng)的ASCII碼對應(yīng)的字符。3.3要達到題目要求的分行顯示,從程序的跟蹤可以看出在在取數(shù)時分為了兩個情況,一個通過SI定位內(nèi)存單元一次性取得一個16位二進制數(shù),另一個是處理數(shù)據(jù)時循環(huán)移位取高四位數(shù)。

7、而要使得數(shù)據(jù)顯示時換行只要在完成一個16位數(shù)據(jù)的轉(zhuǎn)換后取下一個16位數(shù)時進行調(diào)用DOS 2號功能輸出換行符ASCII碼為10即0AH便可。所以在源代碼的基礎(chǔ)上在兩次INC SI前JNZL間添加指令如下MOV DL,0AHMOV AH,2INT 21H 4)可以看到程序首先通過MOV AX,0B800HMOV ES,AX在內(nèi)存開辟了附加段,段首地址為B800H并通過MOV ES:160*1+40*2,AH以便于向B80F0H(位于B8000HBFFFFH彩色字符模式顯示緩沖區(qū))執(zhí)行MOV AH,X寫入字符X,以達到直接改變顯存內(nèi)容顯示。5) 5.1分析圖案第1行打印了9列 *第2行打印了7列 *

8、第3行打印了5列 *第4行打印了3列 *第5行打印了1列 *因此有兩種思路,一是通過調(diào)用DOS 2號功能配合循環(huán)逐一打印字符*,二是借鑒4)中的方法直接改變內(nèi)存內(nèi)容顯示*。但兩種方法都用到了雙重循環(huán),外層循環(huán)控制行的打印,內(nèi)層循環(huán)控制列的打印。結(jié)合圖案分析和循環(huán)數(shù)與行序號不然找到如下關(guān)系:a、1=列數(shù)= 2*當(dāng)前行序號-1而行控制參是外層循環(huán)CX的變動,所以有b、6-CX=當(dāng)前行序號。5.2這里選擇第二種以熟悉并掌握4)中的方法首先按a和b式,就有了偏移地址的計算式:160*(6-CX)+2*Y。其中1=Y=2*CX-1,可通過內(nèi)層循環(huán)實現(xiàn)。5.4因此有最初代碼(錯誤)STACKSEGMENT

9、DB128 DUP(0)STACK ENDSCSEGSEGMENTASSUME CS:CSEG,SS:STACKSTART:MOV AX,STACKMOV SS,AXMOV SP,128MOV AX,0B800HMOV ES,AX ;段裝入MOV CL,5;循環(huán)控制次數(shù)為5MOV CH,0 ;高位清零MOV DH,*;初始打印字符MOV AX,0H:;MOV BL,1 ;從1列開始顯示MOV DL,6;行控制參數(shù)SUB DL,CL;控制當(dāng)前行MOV AL,160MUL DLMOV DI,AX ;保存行參數(shù)MOV AL,2 MUL CLDEC AL(L:)MOV AL,2MUL BL;控制當(dāng)前列

10、ADD AX,DI;顯存空間定位MOV ES:AX,DH;通過顯存顯示INC BL;列打印自加;INC BX(L:)MOV AL,2 MUL CLDEC AL;DEC AX ;MOV SI,AXCMP BL,AL;檢驗打印上限;CMP BX,SIJNA L;未打印完當(dāng)前行返回繼續(xù)打印MOV DL,0AHMOV AH,2INT 21H ;打印完一行則換行LOOP H;行打印循環(huán)MOV AH,4CHINT 21H;退出到DOS界面CSEGENDSEND START6)6.1分析題目要求有三,首先定義緩沖區(qū)存放20個有符號數(shù)據(jù),其次對于正負(fù)數(shù)和零的統(tǒng)計可通過兩次篩選來完成,最后是16進制的轉(zhuǎn)換這在3

11、)中已得以解決,因此有部分流程如下這樣在16進制轉(zhuǎn)換時就有了一個取數(shù)的麻煩,為此考慮如果多開辟一個緩沖區(qū)BUF2來存放三個結(jié)果,下一個指針DI,一來解決了這個問題,二來篩選時通過指針的跳動也同時使得統(tǒng)計結(jié)果的代碼得以簡化,所以就有了如下流程: 6.2按分析結(jié)合流程編輯代碼如下DATA SEGMENTBUF1 DB 1,-3,5,26,0,6,0,24,-17,-10, -21,-5,33,48,0,32,0,10,44,-1 BUF2 DB 3DUP(0)DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AXMOV

12、 CX,20MOV AL,0;MOV SI,OFFSET BUF1(1) ;MOV DI,OFFSET BUF2S:CMP SI,ALJGENEXTCMPJMP ADDD;負(fù)數(shù)的個數(shù)NEXTCMP:INC DICMP SI,ALJZADDD;零的個數(shù)INC DIADDD:ADDBYTE PTR DI,1;正數(shù)的個數(shù)INC SILOOPS;統(tǒng)計個數(shù)MOV DI,OFFSET BUF2P:MOV BX,DI;以下為16進制的轉(zhuǎn)換并顯示注釋參考3)見附錄MOV CH,4;L:MOV CL,4ROL BX,CL;ROL BL,CLMOV DL,BLAND DL,0FHCMP DL,10JBNEXTAD

13、D DL,7NEXT:ADD DL,30HMOV AH,2INT 21HDEC CHJNZLMOV AH,0AH;MOV AH,2;MOV DL,0AHINT 21HINC DICMPDI,OFFSET BUF2+2JNAPMOV AH,4CHINT 21HCODEENDSEND START5實驗數(shù)據(jù)處理和分析2)按最初想法匯編程序得到了下面可怕的結(jié)果由此單步跟蹤觀察,d定位到輸入的字符串所在查看,如圖得知10號功能的調(diào)用并沒出錯,所以應(yīng)該是9號的問題單步到9號功能調(diào)用指令,p執(zhí)行后,發(fā)現(xiàn)在debug確實調(diào)用,并顯示了字符串但在返回DOS界面卻顯示先前的一大堆亂碼,所以認(rèn)為是結(jié)束字符$的關(guān)系,

14、于是修改字符緩沖區(qū)為如下BUF DB 10 DB ?DB 10 DUP(?)DB $結(jié)果出現(xiàn)了如下情況,只要輸入的字符少于9個都會缺失掉前面幾個不唯一。至于問題處在哪,琢磨了好一段時也沒弄清楚,猜想是10號功能的調(diào)用是否已自動回顯了字符串而立刻調(diào)用9號功能是不是產(chǎn)生了覆蓋。于是注釋9號功能的調(diào)用。結(jié)果單一的10號功能的調(diào)用就已會顯了字符串,符合題目要求。3)3.1-1debug調(diào)試,單步跟蹤如圖程序進行取數(shù)操作:不難理解,程序首先通過循環(huán)左移4位將數(shù)據(jù)高4位(二進制數(shù))移出并補到數(shù)據(jù)低位,再將內(nèi)存中一單元的數(shù)據(jù)(數(shù)的低8位二進制數(shù) )傳送至寄存器DL如上圖。3.1-2數(shù)據(jù)處理操作通過指令A(yù)ND

15、 DL,0FH將高四位清零保留低四位如圖a可以看到DX由0094變?yōu)榱?004,至此取得二進制數(shù)的最高四位。將所要轉(zhuǎn)化的四位二進制數(shù)與10做比較,若小于10即0到9可直接加30H得到其對應(yīng)的ASCII碼30H到39H如圖b所示,相反若大于等于10則應(yīng)多加上7跳過7個符號ASCII碼得到其對應(yīng)的16進制ASCII碼41H到46H以達到轉(zhuǎn)換的目的即顯示時打印其相應(yīng)的ASCII碼對應(yīng)的字符。圖a圖b3.2輸入程序,編譯,連接,運行結(jié)果如下雖然達到了以16進制的形式打印要求卻連續(xù)輸出了三個數(shù)。圖c4)立即的顯示結(jié)果混在了debug環(huán)境其他字符中,以至于沒能注意到,老懷疑是自己顯卡的顯存空間分配彩色字符

16、緩沖區(qū)不在內(nèi)存的B8000HBFFFFH間,導(dǎo)致了隨機更改ES段首地址,結(jié)果可想而知,無意清屏?xí)r直接在DOS下運行終于看到了字符X。5)5.1間接尋址,MOV ES:AL,DH寄存器的錯誤應(yīng)用即相對適用的寄存器只有BX,BP,SI和DI錯誤提示如下 通過添加ADD AX,DI 和 MOV DI,AX 指令,寫入字符指令相應(yīng)地改為了MOV ES:DI,DH。5.2更正了錯誤后并排錯語法錯誤后運行結(jié)果仍然出現(xiàn)問題如下結(jié)果并沒有如預(yù)期的一樣,從圖案可以看出,錯誤肯定是在于列打印的控制上,debug單步跟蹤發(fā)現(xiàn)DI中保存的參數(shù)在每次打印時都更新為了前一次打印所計算的偏移地址也就是加上了列的增量,如下圖

17、所示,打印1行2列時,DI由00A2H即162變成了00A6即166。5.3因此在下一行打印之前必須保證DI不變動,所以這里的DI應(yīng)由其他寄存器代替,便修改之為BP,編譯運行也就得到了預(yù)期的圖案。6)匯編代碼出錯如下修改錯誤,保證語法的正確性后,運行程序得到結(jié)果如下,顯然dos2號功能調(diào)用出錯了,統(tǒng)計結(jié)果也不正確,為此只能單步跟蹤在第一次循環(huán)時過程和數(shù)據(jù)處理均正常如下圖a第一個數(shù)第一次篩選圖b第一個數(shù)為大于等于0,DI下移圖c第一個數(shù)大于0,DI繼續(xù)下移一位至0016,實現(xiàn)結(jié)果加1繼續(xù)跟蹤發(fā)現(xiàn),問題出在了每次處理完一個數(shù)據(jù)后DI未能刷新至原點0014圖下修改S:標(biāo)號至(1)處,MOV DI,O

18、FFSET BUF2得到結(jié)果如下不難發(fā)現(xiàn),除了dos2號功能未修改錯外,結(jié)果中后兩位才是正確的結(jié)果,檢查代碼得知是16進制轉(zhuǎn)換時寄存器高8位無用數(shù)據(jù)參與了轉(zhuǎn)換,為此修改P:MOV BX,DIMOV CH,4L:MOV CL,4ROL BX,CL為P:MOV BX,DIMOV CH,2L:MOV CL,4ROL BL,CL問題想是可以得以解決。重新匯編,并運行程序。6. 實驗結(jié)果1)G運行后提示符提示輸入字符,結(jié)果如下回顯輸入的字符2)DOS 10號功能調(diào)用,輸入字符串到自定義的緩沖區(qū)內(nèi),并會顯字符串到屏幕,如下a為debug下,b為dos界面下。圖a圖b3)未進行換行操作換行后顯示結(jié)果如下4)通過MOV ES:160*1+40*2,AH向B80F0H寫入字符X,立即顯示結(jié)果如下5)5.1修改

溫馨提示

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

最新文檔

評論

0/150

提交評論