




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、福建農林大學東方學院信息工程類實驗報告系: 計算機系 專業: 電子信息工程 年級: 10 姓名: 廖少兵 學號: 1050302103 實驗課程: 匯編語言 實驗室號:_ 實驗設備號: 實驗時間: 指導教師簽字: 成績: 實驗五 DOS功能調用1實驗目的和要求1. 學會DOS中關于顯示功能調用指令的用法。2. 領會修改顯存方法顯示字符。2實驗用的軟硬件環境實驗的硬件環境是:IBMPC機及其兼容機實驗的軟件環境是: 操作系統:DOS 2.0以上;調試程序:DEBUG.COM;文本編程程序:EDIT.EXE、WPS.EXE;宏匯編程序:MASM.EXE(或ASM .EXE);連接裝配程序:LINK
2、 .EXE;交叉引用程序:CREF.EXE(可有可無)。3實驗內容及實驗數據記錄1、 輸入一個字符,顯示出來2、 輸入一個字符串,顯示出來3、 buf開始的3個的16位二進制數用十六進制數的形式顯示出來(1)理解程序(2)輸入程序,匯編,運行(在DOS狀態下輸入:文件名.EXE),觀察結果。(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號功能,設置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、 編寫程序,統計字緩沖區中的20個數據的正數、負數、0的個數,并將統計結果以16進制形式顯示出來。4操作方法及實驗步驟1)直接調用DOS 1號功能即可,debug環境中a命令直接編輯代碼寫入內存如下指令MOVA
5、H,01INT21HMOVAH,4CINT21H2)字符串的輸入和顯示,原以為在調用10號功能后需要調用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&a
6、mp;3.2我們知道要將數以16進制的形式顯示就必須找到其對應的字母ABCDEF的ASCII碼,ASCII碼48是數字0的開始也就是16進制中的30,而3AH開始至40H為7個常用符號的ASCII碼值,從41H開始才是大寫字母的ASCII碼值,因此將所要轉化的四位二進制數與10做比較,若小于10可直接加30H得到其對應的ASCII碼,若大于等于10則應多加上7跳過7個符號ASCII碼得到其對應的16進制ASCII碼以達到轉換的目的即顯示時打印其相應的ASCII碼對應的字符。3.3要達到題目要求的分行顯示,從程序的跟蹤可以看出在在取數時分為了兩個情況,一個通過SI定位內存單元一次性取得一個16位
7、二進制數,另一個是處理數據時循環移位取高四位數。而要使得數據顯示時換行只要在完成一個16位數據的轉換后取下一個16位數時進行調用DOS 2號功能輸出換行符ASCII碼為10即0AH便可。所以在源代碼的基礎上在兩次INC SI前JNZL間添加指令如下MOV DL,0AHMOV AH,2INT 21H 4)可以看到程序首先通過MOV AX,0B800HMOV ES,AX在內存開辟了附加段,段首地址為B800H并通過MOV ES:160*1+40*2,AH以便于向B80F0H(位于B8000HBFFFFH彩色字符模式顯示緩沖區)執行MOV AH,'X'寫入字符X,以達到直接改變顯存內
8、容顯示。5) 5.1分析圖案第1行打印了9列 *第2行打印了7列 *第3行打印了5列 *第4行打印了3列 *第5行打印了1列 *因此有兩種思路,一是通過調用DOS 2號功能配合循環逐一打印字符'*',二是借鑒4)中的方法直接改變內存內容顯示'*'。但兩種方法都用到了雙重循環,外層循環控制行的打印,內層循環控制列的打印。結合圖案分析和循環數與行序號不然找到如下關系:a、1<=列數<= 2*當前行序號-1而行控制參是外層循環CX的變動,所以有b、6-CX=當前行序號。5.2這里選擇第二種以熟悉并掌握4)中的方法首先按a和b式,就有了偏移地址的計算式:16
9、0*(6-CX)+2*Y。其中1<=Y<=2*CX-1,可通過內層循環實現。5.4因此有最初代碼(錯誤)STACKSEGMENTDB128 DUP(0)STACK ENDSCSEGSEGMENTASSUME CS:CSEG,SS:STACKSTART:MOV AX,STACKMOV SS,AXMOV SP,128MOV AX,0B800HMOV ES,AX ;段裝入MOV CL,5;循環控制次數為5MOV CH,0 ;高位清零MOV DH,'*'初始打印字符MOV AX,0H:;MOV BL,1 ;從1列開始顯示MOV DL,6;行控制參數SUB DL,CL;控制當
10、前行MOV AL,160MUL DLMOV DI,AX ;保存行參數MOV AL,2 MUL CLDEC AL(L:)MOV AL,2MUL BL;控制當前列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;未打印完當前行返回繼續打印MOV DL,0AHMOV AH,2INT 21H ;打印完一行則換行LOOP H;行打印循環MOV AH,4CHINT 21H;退出到DOS界面CSEGEN
11、DSEND START6)6.1分析題目要求有三,首先定義緩沖區存放20個有符號數據,其次對于正負數和零的統計可通過兩次篩選來完成,最后是16進制的轉換這在3)中已得以解決,因此有部分流程如下這樣在16進制轉換時就有了一個取數的麻煩,為此考慮如果多開辟一個緩沖區BUF2來存放三個結果,下一個指針DI,一來解決了這個問題,二來篩選時通過指針的跳動也同時使得統計結果的代碼得以簡化,所以就有了如下流程: 6.2按分析結合流程編輯代碼如下DATA SEGMENTBUF1 DB 1,-3,5,26,0,6,0,24,-17,-10, -21,-5,33,48,0,32,0,10,44,-1 BUF2 D
12、B 3DUP(0)DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AXMOV CX,20MOV AL,0;MOV SI,OFFSET BUF1(1) ;MOV DI,OFFSET BUF2S:CMP SI,ALJGENEXTCMPJMP ADDD;負數的個數NEXTCMP:INC DICMP SI,ALJZADDD;零的個數INC DIADDD:ADDBYTE PTR DI,1;正數的個數INC SILOOPS;統計個數MOV DI,OFFSET BUF2P:MOV BX,DI;以下為16進制的轉換并顯示注釋參考
13、3)見附錄MOV CH,4;L:MOV CL,4ROL BX,CL;ROL BL,CLMOV DL,BLAND DL,0FHCMP DL,10JBNEXTADD 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實驗數據處理和分析2)按最初想法匯編程序得到了下面可怕的結果由此單步跟蹤觀察,d定位到輸入的字符串所在查看,如圖得知10號功能的調用并沒出錯,所以應
14、該是9號的問題單步到9號功能調用指令,p執行后,發現在debug確實調用,并顯示了字符串但在返回DOS界面卻顯示先前的一大堆亂碼,所以認為是結束字符'$'的關系,于是修改字符緩沖區為如下BUF DB 10 DB ?DB 10 DUP(?)DB '$'結果出現了如下情況,只要輸入的字符少于9個都會缺失掉前面幾個不唯一。至于問題處在哪,琢磨了好一段時也沒弄清楚,猜想是10號功能的調用是否已自動回顯了字符串而立刻調用9號功能是不是產生了覆蓋。于是注釋9號功能的調用。結果單一的10號功能的調用就已會顯了字符串,符合題目要求。3)3.1-1debug調試,單步跟蹤如圖程序
15、進行取數操作:不難理解,程序首先通過循環左移4位將數據高4位(二進制數)移出并補到數據低位,再將內存中一單元的數據(數的低8位二進制數 )傳送至寄存器DL如上圖。3.1-2數據處理操作通過指令AND DL,0FH將高四位清零保留低四位如圖a可以看到DX由0094變為了0004,至此取得二進制數的最高四位。將所要轉化的四位二進制數與10做比較,若小于10即0到9可直接加30H得到其對應的ASCII碼30H到39H如圖b所示,相反若大于等于10則應多加上7跳過7個符號ASCII碼得到其對應的16進制ASCII碼41H到46H以達到轉換的目的即顯示時打印其相應的ASCII碼對應的字符。圖a圖b3.2
16、輸入程序,編譯,連接,運行結果如下雖然達到了以16進制的形式打印要求卻連續輸出了三個數。圖c4)立即的顯示結果混在了debug環境其他字符中,以至于沒能注意到,老懷疑是自己顯卡的顯存空間分配彩色字符緩沖區不在內存的B8000HBFFFFH間,導致了隨機更改ES段首地址,結果可想而知,無意清屏時直接在DOS下運行終于看到了字符X。5)5.1間接尋址,MOV ES:AL,DH寄存器的錯誤應用即相對適用的寄存器只有BX,BP,SI和DI錯誤提示如下 通過添加ADD AX,DI 和 MOV DI,AX 指令,寫入字符指令相應地改為了MOV ES:DI,DH。5.2更正了錯誤后并排錯語法錯誤后運行結果仍
17、然出現問題如下結果并沒有如預期的一樣,從圖案可以看出,錯誤肯定是在于列打印的控制上,debug單步跟蹤發現DI中保存的參數在每次打印時都更新為了前一次打印所計算的偏移地址也就是加上了列的增量,如下圖所示,打印1行2列時,DI由00A2H即162變成了00A6即166。5.3因此在下一行打印之前必須保證DI不變動,所以這里的DI應由其他寄存器代替,便修改之為BP,編譯運行也就得到了預期的圖案。6)匯編代碼出錯如下修改錯誤,保證語法的正確性后,運行程序得到結果如下,顯然dos2號功能調用出錯了,統計結果也不正確,為此只能單步跟蹤在第一次循環時過程和數據處理均正常如下圖a第一個數第一次篩選圖b第一個
18、數為大于等于0,DI下移圖c第一個數大于0,DI繼續下移一位至0016,實現結果加1繼續跟蹤發現,問題出在了每次處理完一個數據后DI未能刷新至原點0014圖下修改S:標號至(1)處,MOV DI,OFFSET BUF2得到結果如下不難發現,除了dos2號功能未修改錯外,結果中后兩位才是正確的結果,檢查代碼得知是16進制轉換時寄存器高8位無用數據參與了轉換,為此修改P:MOV BX,DIMOV CH,4L:MOV CL,4ROL BX,CL為P:MOV BX,DIMOV CH,2L:MOV CL,4ROL BL,CL問題想是可以得以解決。重新匯編,并運行程序。6. 實驗結果1)G運行后提示符提示輸入字符,結果如下回顯輸入的字符2)DOS 10號功能調用,輸入字符串到自定義的緩沖區內,并會顯字符串到屏幕,如下a為debug下,b為dos界面下。圖a圖b3)未進行換行操作換行后顯示結果如下4)通過MOV ES:160*1+40*2,AH向B80F0H寫入字符'X',立即顯示
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智慧辦公的新星NACHI那智推動的變革與機遇
- 光伏瓦片耐久性提升技術行業跨境出海項目商業計劃書
- 藥物臨床前安全性評估行業深度調研及發展項目商業計劃書
- 健康與安全培訓行業跨境出海項目商業計劃書
- 藥效學網絡行業深度調研及發展項目商業計劃書
- 個性化學習筆記本定制企業制定與實施新質生產力項目商業計劃書
- 2025年中國高濃度造紙黑液提取機市場調查研究報告
- 2025年中國點塑卡通片沖件自動鎖市場調查研究報告
- 2025年中國抽氣式轉杯市場調查研究報告
- 2025年中國座便器排污管市場調查研究報告
- 部編版七年級歷史(下)材料論述題專項訓練
- 年產1000噸乳酸的生產工藝設計
- 博克服裝CAD制版說明操作手冊(共95頁)
- 南開中學小卷數學模擬試卷(共3頁)
- 光電效應測普朗克常數-實驗報告
- (完整word版)數據模型與決策課程案例分析
- 自制桁架移動式操作平臺施工方案
- 物業服務參與校園文化建設及舉辦大型活動配合措施
- 太陽能LED路燈項目實施方案
- 調崗調薪實操指引PPT課件
- 福清核電廠輻射防護生產準備實踐
評論
0/150
提交評論