鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示_第1頁
鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示_第2頁
鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示_第3頁
鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示_第4頁
鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、武漢理工大學(xué)微機(jī)原理與接口技術(shù)課程設(shè)計(jì)說明書課程設(shè)計(jì)任務(wù)書學(xué)生姓名: 專業(yè)班級(jí): 指導(dǎo)教師: 工作單位: 題 目: 鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示(有拓展任務(wù))初始條件:掌握匯編語言程序設(shè)計(jì)方法,所設(shè)計(jì)的程序運(yùn)行后可通過鍵盤控制,滿足系統(tǒng)功能,并實(shí)現(xiàn)該系統(tǒng)設(shè)計(jì)方案。在DOS,windows,匯編軟件環(huán)境下運(yùn)行。要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說明書撰寫等具體要求)本程序能從鍵盤讀入二個(gè)五位十進(jìn)制數(shù)(1位符號(hào)位+4位數(shù)值位),并將這二個(gè)十進(jìn)制數(shù)分別轉(zhuǎn)換為二進(jìn)制數(shù),然后求其和,再將和以十進(jìn)制形式進(jìn)行顯示。2. 課程設(shè)計(jì)說明書應(yīng)包括:a)設(shè)計(jì)任務(wù)及要求b)方案比較及認(rèn)證c)程序

2、設(shè)計(jì)基本思想,程序流程圖,部分源程序及注解d)調(diào)試記錄及結(jié)果分析e)參考資料f)附錄:全部源程序清單g)總結(jié)時(shí)間安排:2013年元月07日-元月09日 選題、查閱資料和方案設(shè)計(jì)2013年元月10日-元月14日 編程2013年元月15日-元月16日 調(diào)試程序,改進(jìn)與提高2013年元月17日 撰寫課程設(shè)計(jì)報(bào)告(有調(diào)試過程及結(jié)果的截屏)2013年元月18日 答辯和交課程設(shè)計(jì)報(bào)告指導(dǎo)教師簽名: 2013 年 元 月 18 日系主任(或責(zé)任教師)簽名: 年 月 日目錄1設(shè)計(jì)任務(wù)及要求分析11.1設(shè)計(jì)任務(wù)11.2要求分析12 各模塊原理框圖22.1 基礎(chǔ)任務(wù)流程圖22.2 拓展任務(wù)一流程圖32.3 拓展任

3、務(wù)二流程圖42.4 拓展任務(wù)三流程圖53 系統(tǒng)模塊詳細(xì)設(shè)計(jì)與調(diào)試63.1 基礎(chǔ)任務(wù)的設(shè)計(jì)63.1.1 輸入兩個(gè)數(shù)據(jù)63.1.2 兩個(gè)二進(jìn)制數(shù)求和并顯示和63.1.3 十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù):73.1.4 二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù):83.1.5 程序調(diào)試結(jié)果93.2拓展任務(wù)一設(shè)計(jì)93.3拓展任務(wù)二設(shè)計(jì)113.3.1主程序模塊.113.3.2賦權(quán)宏模塊.113.3.3加減乘除運(yùn)算子程序模塊.113.3.4 調(diào)用賦權(quán)宏子程序模塊.123.3.5 清屏子程序模塊.123.3.6 回車換行宏模塊.123.3.7 9號(hào)功能顯示字符串宏模塊.123.3.8 程序調(diào)試結(jié)果圖123.4 拓展任務(wù)三設(shè)計(jì)133.5

4、調(diào)試結(jié)果分析155心得體會(huì)16參考文獻(xiàn)18附錄一 源程序及注釋19本科生課程設(shè)計(jì)成績?cè)u(píng)定表32鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示摘要:本次微機(jī)原理課程設(shè)計(jì)題目是將二個(gè)五位十進(jìn)制數(shù)轉(zhuǎn)化為二進(jìn)制后相加后再轉(zhuǎn)化為十進(jìn)制輸出。這次程序是運(yùn)行于硬件和DOS操作系統(tǒng)下的,本程序通過調(diào)用DOS下的基本輸入輸出中斷,實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出。程序中有兩個(gè)子程序,分別負(fù)責(zé)將十進(jìn)制數(shù)轉(zhuǎn)化為二進(jìn)制數(shù)和二進(jìn)制轉(zhuǎn)化為十進(jìn)制。最后調(diào)用DOS輸出中斷顯示在屏幕上,最后看用戶是否輸入的是或者,若是則程序結(jié)束,若不是則程序循環(huán)。因?yàn)榇疝q過程中老師認(rèn)為設(shè)計(jì)任務(wù)較為簡(jiǎn)單,于是我們組一起研究出了一些拓展功能:比如輸入字母的大小寫轉(zhuǎn)換和輸入數(shù)字的四

5、則運(yùn)算,讓我們本次課程設(shè)計(jì)學(xué)到更多的知識(shí)。關(guān)鍵詞:ASCII碼 二進(jìn)制 DOS調(diào)用 中斷 數(shù)據(jù)輸入1設(shè)計(jì)任務(wù)及要求分析1.1設(shè)計(jì)任務(wù)基礎(chǔ)任務(wù):從鍵盤讀入二個(gè)五位十進(jìn)制數(shù)(1位符號(hào)位+4位數(shù)值位),并將這二個(gè)十進(jìn)制數(shù),分別轉(zhuǎn)換為二進(jìn)制數(shù),然后求其和,再將和以十進(jìn)制形式進(jìn)行顯示。按Q退出程序。拓展任務(wù):(1)輸入一堆字符串字母,能將其中小寫字母變?yōu)榇髮懽帜福髮懽帜覆蛔?;?)輸入的數(shù)字可進(jìn)行加減乘除四則運(yùn)算得到結(jié)果。(3)對(duì)輸入的兩串字符串進(jìn)行匹配判斷。1.2要求分析從設(shè)計(jì)任務(wù)中可以看出此次課設(shè)要求是:從鍵盤中輸入兩個(gè)五位十進(jìn)制數(shù)(格式如-1234、+2012等),顯然通過鍵盤輸入的此類十進(jìn)制數(shù)

6、實(shí)際上輸入的是對(duì)應(yīng)字符的ASCII碼,若想求兩個(gè)數(shù)的和必須先將這兩個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制數(shù)求出,然后再求其和,求和完成后將二進(jìn)制數(shù)再轉(zhuǎn)換成對(duì)應(yīng)的十進(jìn)制數(shù)用顯示器輸出,完成兩個(gè)五位十進(jìn)制數(shù)的求和然后以十進(jìn)制的形式顯示。而拓展任務(wù)一字母大小寫轉(zhuǎn)換則是將輸入字符串中的小寫字母識(shí)別出來并加上一定數(shù)使其變?yōu)榇髮懀髮懽帜竸t不變化;拓展二任務(wù)是將輸入兩個(gè)數(shù)據(jù)進(jìn)行四則運(yùn)算,可以對(duì)運(yùn)算法則進(jìn)行選擇最后輸出結(jié)果;拓展任務(wù)三則是將輸入字符串的每個(gè)字母進(jìn)行比較,若全部相同則匹配,若有一個(gè)不相同就輸出不匹配信息。2 各模塊原理框圖2.1 基礎(chǔ)任務(wù)流程圖輸入一個(gè)數(shù)開始取第一個(gè)數(shù)轉(zhuǎn)換為二進(jìn)制并保存輸入第二個(gè)數(shù)取第二個(gè)數(shù)轉(zhuǎn)換為二

7、進(jìn)制并保存結(jié)束在屏幕上顯示和兩數(shù)相加,和轉(zhuǎn)換為ASCII碼保存圖2-1 基礎(chǔ)任務(wù)流程圖2.2 拓展任務(wù)一流程圖NY入口段寄存器和堆棧初始化BX指向字符行緩沖區(qū)首址偏移指針SI清0INT 21H的01H號(hào)子功能接收鍵入字符是小寫字母?是回車鍵?是ctrl+c鍵?小寫字母的ASCII碼值轉(zhuǎn)化為大寫字母的ASCII碼值存入字符緩沖區(qū)BX+SI單元SI加1指向下一單元顯示轉(zhuǎn)換后的字符行緩沖區(qū)內(nèi)容返回DOSYYNN圖2-2 拓展任務(wù)一流程圖2.3 拓展任務(wù)二流程圖開始清屏加載數(shù)據(jù)段附加段顯示界面input輸入數(shù)字或字符輸入的是=,數(shù)字,符號(hào)?SIGN1=0?保存數(shù)字顯示錯(cuò)誤=數(shù)字符號(hào)SIGN2=0?ny

8、下移2位將SIGN1賦0設(shè)優(yōu)先級(jí),并判斷是何符號(hào)ny根據(jù)符號(hào)決定運(yùn)算,將值存入numbOutput通過2號(hào)功能顯示結(jié)果是否繼續(xù)?結(jié)束ynDi+2取number,operator的偏移地址圖2-3 拓展任務(wù)二流程圖2.4 拓展任務(wù)三流程圖顯示“NO MATCH”SI加1,指向下一字符字符已取完?返回 DOS相等?顯示“MATCH”入口初始化顯示請(qǐng)輸入字符串1 用INT 21H的0AH號(hào)子功能,接收字符串顯示請(qǐng)輸入字符串2SI指向串1的首字符SI指向的字符和字符串2比較NYNY圖2-4 拓展任務(wù)三流程圖3 系統(tǒng)模塊詳細(xì)設(shè)計(jì)與調(diào)試3.1 基礎(chǔ)任務(wù)的設(shè)計(jì)3.1.1 輸入兩個(gè)數(shù)據(jù)MOV AH,09H I

9、NT 21H 通過調(diào)用DOS系統(tǒng)的01H號(hào)功能鍵入字符并回車來實(shí)現(xiàn),其出口參數(shù)為鍵入字符的ASCII碼,存在AL中DATA SEGMENTMOV AX , DATA MOV DS , AX MOV DX , OFFSET INPUT1 MOV AH , 9 ;多字符輸出到屏幕 INT 21H ;提示輸入一個(gè)數(shù) MOV DX , OFFSET IN_ASC_BUF MOV AH,0AH ;多字符輸入 INT 21H ;讀取第一個(gè)數(shù) CALL ASC_TO_BIN ;轉(zhuǎn)換第一個(gè)數(shù)為二進(jìn)制 MOV B_BUF1 , AX ;保存第一個(gè)數(shù) MOV DX , OFFSET INPUT2 MOV AH ,

10、 9 INT 21H ;提示輸入一個(gè)數(shù) MOV DX , OFFSET IN_ASC_BUF MOV AH , 0AH INT 21H ;讀取第二個(gè)數(shù) CALL ASC_TO_BIN ;轉(zhuǎn)換第二個(gè)數(shù)為二進(jìn)制3.1.2 兩個(gè)二進(jìn)制數(shù)求和并顯示和顯示結(jié)果: MOV AH,09H MOV DX, OFFSET OUT_ASC_SUM INT 21H將結(jié)果存入數(shù)據(jù)段中定義的緩沖區(qū)OUT_ASC_SUM中,再通過調(diào)用DOS系統(tǒng)的09H號(hào)功能顯示字符串(串尾字符為,但不顯示)來完成。ADD AX , B_BUF1 ;計(jì)算這二個(gè)數(shù)之和CALL BIN_TO_ASCII ;將和轉(zhuǎn)換為ASCII碼,以供顯示用M

11、OV DX , OFFSET OUTPUTMOV AH , 9 ;多字符輸出INT 21HMOV DX , OFFSET OUT_ASC_SUM ;將二個(gè)數(shù)的和轉(zhuǎn)換為ASCII碼后放于此處, ;以供9號(hào)調(diào)用顯示MOV AH , 9INT 21H ;輸出總和MOV DX,OFFSET QUITMOV AH , 9INT 21HMOV AH , 1INT 21H CMP AL,'Q' ;是否輸入QJZ OVERCMP AL,'q' ;是否輸入qJZ OVERJMP STARTOVER: MOV AH , 4CH ;結(jié)束INT 21H3.1.3 十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)

12、: 入口:十進(jìn)制數(shù)的ASCII碼在IN_ASC_BUF內(nèi)出口:轉(zhuǎn)換后的二進(jìn)制數(shù)在AX內(nèi)算法:先將其轉(zhuǎn)換成十進(jìn)制數(shù)字,再用累加和乘10加X的方法變成二進(jìn)制數(shù),如將358轉(zhuǎn)換為二進(jìn)制數(shù),可先將累加和賦0,再計(jì)算(0*10+3)*10+5)*10+8),結(jié)果為二進(jìn)制數(shù),再由符號(hào)位決定是否需要求補(bǔ)。ASC_TO_BIN PROC MOV CL , IN_ASC_BUF+1 ;取字符個(gè)數(shù) MOV CH , 0 DEC CL ;扣除符號(hào)位 MOV BX , OFFSET IN_ASC_BUF+3 ;調(diào)整BX指向十進(jìn)制數(shù)的最高位 PUSH BX PUSH CXL1: MOV AL , BX AND AL ,

13、 0FH MOV BX , AL INC BX LOOP L1 ;將所有數(shù)字字符的高四位清0 POP CX POP BX MOV AX , 0 ;累加和賦初值 MOV SI , 10L2: MUL SI ADD AL , BX ADC AH , 0 INC BX LOOP L2 ;累加乘10 CMP IN_ASC_BUF+2 , '+' JZ L3 ;符號(hào)是正號(hào),轉(zhuǎn)移 NEG AX ;符號(hào)是負(fù)號(hào),求補(bǔ)L3: RETASC_TO_BIN ENDP3.1.4 二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù): 入口:二進(jìn)制數(shù)在AX內(nèi)出口:轉(zhuǎn)換后的ASCII碼在OUT_ASC_SUM變量內(nèi)算法:AX中的數(shù)范圍

14、在+32767到-32768之間,先檢查AX中的符號(hào)位,以決定輸出“+”還是“-”,若是負(fù)數(shù),應(yīng)先求補(bǔ),得到原碼后即可與正數(shù)作統(tǒng)一處理。轉(zhuǎn)換方法為將被轉(zhuǎn)換的二進(jìn)制數(shù)先除以10000,商;即為萬位數(shù),再將余數(shù)除以1000,商為千位數(shù),以此類推,求出百、十位數(shù),剩下的為個(gè)位數(shù)。最后,將各個(gè)數(shù)加上30H,即成為對(duì)應(yīng)字符。BIN_TO_ASCII PROC MOV OUT_ASC_SUM , '+' CMP AX , 0 JGE L4 ;不是負(fù)數(shù),轉(zhuǎn)移 NEG AX MOV OUT_ASC_SUM , '-'L4: CWD MOV BX , 10000 DIV BX A

15、DD AL , 30H MOV OUT_ASC_SUM+1 , AL ;保存萬位數(shù)字 MOV AX , DX ;將余數(shù)置入AX內(nèi),以便當(dāng)作被除數(shù) CWD MOV BX , 1000 DIV BX ADD AL , 30H MOV OUT_ASC_SUM+2 , AL ;保存千位數(shù)字 MOV AX , DX ;將余數(shù)置入AX內(nèi),以便當(dāng)作被除數(shù) MOV BL , 100 DIV BL ADD AL , 30H MOV OUT_ASC_SUM+3 , AL ;保存百位數(shù)字 MOV AL , AH CBW MOV BL , 10 DIV BL ADD AL , 30H MOV OUT_ASC_SUM+

16、4 , AL ;保存十位數(shù)字 ADD AH , 30H MOV OUT_ASC_SUM+5 , AH ;保存?zhèn)€位數(shù)字 RETBIN_TO_ASCII ENDP3.1.5 程序調(diào)試結(jié)果如圖所示:圖3-1 基礎(chǔ)任務(wù)程序調(diào)試結(jié)果3.2拓展任務(wù)一設(shè)計(jì)可以輸入任意長度大小寫或大小寫混合字符串,并轉(zhuǎn)換成純大寫或小寫字符串 DATAS SEGMENT ;數(shù)據(jù)段 DATA1 DB 100 DUP(?) STRING1 DB 0DH,0AH,'$' STRING2 DB 'PLEASE INPUT STRING:',0DH,0AH,'$' STRING3 DB &

17、#39;THE RESULT=',0DH,0AH,'$' DATAS ENDS STACKS SEGMENT STACK ;堆棧段 DW 128 DUP(?) ;注意這里只有128個(gè)字節(jié) STACKS ENDS CODES SEGMENT ;代碼段 ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS ;初始化 MOV DS,AX MOV ES,AX MOV BX,0 LEA DX,STRING2 ;提示輸入 MOV AH,09 INT 21H INPUT: MOV AH,01 ;輸入字符放在AL中 INT 21H CMP AL,0D

18、H JE HUANHAN CMP AL,5BH JNC CHANGE MOV DATA1BX,AL ;AL中的字符存入DATA1的第BX位 INC BX LOOP INPUT CHANGE: SUB AL,20H ;小寫轉(zhuǎn)大寫 ;ADD AL,20H MOV DATA1BX,AL INC BX JMP INPUT HUANHAN: LEA DX,STRING1 ;換行,回車 MOV AH,09 INT 21H LEA DX,STRING3 ;提示輸出 MOV AH,09 INT 21H SHUCHU: MOV DATA1BX,'$' LEA DX,DATA1 ;把字符串的首地址

19、放進(jìn)DX MOV AH,09 ;輸出DATA1中已經(jīng)改變了的字符串 INT 21H CODES ENDS END START輸入程序后結(jié)果如圖:圖3-2 大小字母轉(zhuǎn)換運(yùn)行結(jié)果圖3.3拓展任務(wù)二設(shè)計(jì)3.3.1主程序模塊.主程序模塊首先實(shí)現(xiàn)調(diào)用子程序clear清屏,初始化數(shù)據(jù)段,加載附加段,調(diào)用顯示宏show顯示界面,將寄存器ax,bx,cx,dx初始化賦初值為0,調(diào)用回車換行宏,輸入字符或數(shù)字并判斷,調(diào)用子程序dyfq調(diào)用賦權(quán)宏fq為符號(hào)賦權(quán),從而判斷優(yōu)先級(jí),調(diào)用加減乘除運(yùn)算子程序ys對(duì)判斷出的相應(yīng)運(yùn)算符進(jìn)行運(yùn)算,輸出運(yùn)算結(jié)果,判斷是否繼續(xù),繼續(xù)則返回輸入,不繼續(xù)則退出程序.3.3.2賦權(quán)宏模塊

20、.通過定義宏fq,定義了變?cè)猘,b進(jìn)行參數(shù)傳遞,并使用替換運(yùn)算符&使變?cè)猘與標(biāo)號(hào)s對(duì)應(yīng).接著給對(duì)應(yīng)的符號(hào)賦予權(quán)值,將其權(quán)值存入ch中.3.3.3加減乘除運(yùn)算子程序模塊.運(yùn)算模塊實(shí)現(xiàn)了將ax入棧保存,然后將ax,bx賦值為0,判斷cl中的符號(hào)是否為乘號(hào)*,若為乘號(hào)*則將number中的數(shù)字與其下一位的數(shù)字相乘,并把結(jié)果存入該位置,類似的若不為乘號(hào)*則接著判斷是否為除號(hào)/,若為除號(hào)/則進(jìn)行除法運(yùn)算,然后判斷是否為加法,為加法則進(jìn)行加法運(yùn)算,接著判斷是否為減法,為減法則進(jìn)行減法運(yùn)算并將結(jié)果存入當(dāng)前的計(jì)算的第二個(gè)數(shù)的位置.3.3.4 調(diào)用賦權(quán)宏子程序模塊.該模塊實(shí)現(xiàn)了調(diào)用賦權(quán)宏fq為(,),*

21、,/,+,-,=等符號(hào)分別賦權(quán)值為5,1,4,4,3,3,0.從而可以通過設(shè)定的權(quán)值來判斷優(yōu)先級(jí).3.3.5 清屏子程序模塊.本模塊先將即將用到的ax,bx,cx,dx寄存器入棧保存,通過ah=06h屏幕上卷功能,用bh=07h將屏幕設(shè)置為黑底白字格式,給dh,dl賦值將其清屏位置設(shè)定在30行80列范圍.從而實(shí)現(xiàn)了清屏功能,然后再將ax,bx,cx,dx寄存器出棧.3.3.6 回車換行宏模塊.通過2號(hào)功能的輸出功能,將0dh賦予dl輸出,再調(diào)用2號(hào)功能,將0ah賦予dl輸出,從而實(shí)現(xiàn)回車換行功能.3.3.7 9號(hào)功能顯示字符串宏模塊.通過定義宏show,用9號(hào)顯示功能,通過變?cè)猻tr將字符串顯

22、示出來.3.3.8 程序調(diào)試結(jié)果圖如圖所示:圖3-3 輸入數(shù)據(jù)四則運(yùn)算結(jié)果圖3.4 拓展任務(wù)三設(shè)計(jì)字符串匹配設(shè)計(jì):CRLF MACRO ;顯示回車 MOV DL,0DH MOV AH,02H INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDMDATA SEGMENTMESS1 DB 'MATCH',0DH,0AH,'$'MESS2 DB 'NO MATCH',0DH,0AH,'$'MESS3 DB 'INPUT STRING1!',0DH,0AH,'$'MESS4

23、DB 'INPUT STRING2!',0DH,0AH,'$'MAXLEN1 DB 100STRING1 DB 100 DUP(?)MAXLEN2 DB 100STRING2 DB 100 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AH,09H MOV DX,OFFSET MESS3 INT 21H ;顯示提示信息1 MOV AL,MAXLEN1 MOV BX,OFFSET STRING1 MOV BX,A

24、L ;最大字符緩沖 MOV AH,0AH MOV DX,OFFSET STRING1 INT 21H ;接收鍵入的字符串1 CRLF MOV AH,09H MOV DX,OFFSET MESS4 INT 21H ;顯示提示信息2 MOV AL,MAXLEN2 MOV BX,OFFSET STRING2 MOV BX,AL ;最大字符緩沖設(shè)置 MOV AH,0AH MOV DX,OFFSET STRING2 INT 21H ;接收鍵入的字符串2 CRLFCLD LEA SI,STRING1 ;字符串1的地址送給SI MOV CL,SI+1 ;字符串1的字符數(shù)送給CX MOV CH,0BEING:

25、 LEA DI,STRING2 ;字符串2的地址送給DI MOV DL,DI+1 ;字符串2的字符數(shù)送給DX MOV DH,0J1: MOV AL,SI+2 ;字符串1的第一個(gè)字符在字符串2中匹配 CMP DI+2,AL JE J3 ;匹配成功則跳轉(zhuǎn)J2: INC DI ;指向字符串2下一個(gè)字符 DEC DX JZ NOMAT ;字符串2完,不匹配 JMP J1 ;字符串2沒完,重新匹配J3: DEC CX JZ MATCH ;字符串1完,匹配 DEC DX JZ NOMAT ;字符串2完,不匹配 INC SI ;指向串1下一個(gè)字符 INC DI ;指向串2下一個(gè)字符 MOV AL,SI+2

26、CMP DI+2,AL JE J3 ;匹配,跳轉(zhuǎn) DEC DX JZ NOMAT ;字符串2完,不匹配 LEA SI,STRING1 ;重新從串1的第一個(gè)字符匹配 MOV CL,SI+1 MOV CH,0 JMP J1MATCH: MOV AH,09H ;輸出匹配信息 MOV DX,OFFSET MESS1 INT 21H JMP NEXTNOMAT: MOV AH,09H ;輸出不匹配信息 MOV DX,OFFSET MESS2 INT 21H NEXT: MOV AH,4CH ;程序終止 INT 21HCODE ENDS END START 輸入程序后調(diào)試結(jié)果如圖:圖3-4 字符串匹配問題

27、輸出結(jié)果3.5 調(diào)試結(jié)果分析從圖3-1到3-4可以看出,程序運(yùn)行結(jié)果完全滿足預(yù)期要求。但是在程序的調(diào)試過程中還是出現(xiàn)了許多的問題:第一,輸出結(jié)果產(chǎn)生閃退,但我們細(xì)心檢查每一個(gè)error的部分然后在網(wǎng)上查閱了大量資料,知道了在程序尾部的中斷命令經(jīng)常會(huì)引起程序閃退,找到根源后調(diào)整尾部命令即可使程序順利運(yùn)行。第二,輸入的字符非Q、q時(shí),程序也會(huì)結(jié)束。在和Q、q比較的程序段之后、過程終止程序段之前加上jmp start語句,即正常了。第三,在使用復(fù)制操作DUP時(shí),未將復(fù)制數(shù)目與DUP用空格分隔開,導(dǎo)致運(yùn)行錯(cuò)誤。第四,進(jìn)行CALL指令調(diào)用子程序時(shí),容易遺漏在CALL后的RET指令,導(dǎo)致運(yùn)行時(shí)出現(xiàn)錯(cuò)誤。第

28、五,在使用條件轉(zhuǎn)移指令jz時(shí),發(fā)現(xiàn)不能生成obj文件,經(jīng)檢查發(fā)現(xiàn)jz與要調(diào)用的程序距離太遠(yuǎn),把二者距離拉近后問題得到解決。調(diào)試過程截圖如下所示:圖3-5 因缺少ret產(chǎn)生錯(cuò)誤圖3-6 找到錯(cuò)誤行并加上ret后正常運(yùn)行圖3-7 程序發(fā)生閃退時(shí)加上JMP語句解決5心得體會(huì)在這次微機(jī)原理與接口技術(shù)課程設(shè)計(jì)過程中,我所選的課題是“鍵盤錄入數(shù)據(jù)的轉(zhuǎn)換與顯示程序設(shè)計(jì)”。最開始看完設(shè)計(jì)要求后,通過查書和上網(wǎng)找資料選擇所需的匯編程序,將每一塊的設(shè)計(jì)要求轉(zhuǎn)換成能夠?qū)崿F(xiàn)其功能的模塊匯編語句,然后合在一起完成整個(gè)程序的設(shè)計(jì),最后通過計(jì)算機(jī)中的MF2KP軟件對(duì)該匯編程序進(jìn)行調(diào)試運(yùn)行,得到了所要的結(jié)果。但第二天去跟老師

29、答辯的過程中我發(fā)現(xiàn)我們的題目過于簡(jiǎn)單,其實(shí)在鍵盤輸入這一塊還可以往多方面延伸拓展其他功能使其變得豐富一些,于是我們又繼續(xù)研究除輸入數(shù)字整數(shù)求和外的其他功能,最后終于延伸了三個(gè)拓展功能,分別是輸入數(shù)據(jù)的加減乘除四則運(yùn)算,輸入字符串的匹配與否和輸入字母的大小寫轉(zhuǎn)換。在將模塊程序進(jìn)行整合的過程中,由于每一塊所用語句中的操作數(shù)有些不同,因而在運(yùn)行的出現(xiàn)了不少錯(cuò)誤,但是我們并沒有泄氣而是根據(jù)提示所在錯(cuò)誤行一條條對(duì)源程序進(jìn)行修改,修改之后再進(jìn)行運(yùn)行,還是出錯(cuò),只能再次回到源程序進(jìn)行修改,不僅僅要看出錯(cuò)的那一行,還要聯(lián)系前后找出錯(cuò)誤的根源。經(jīng)過這樣的一次次編譯修改,最終才沒有錯(cuò)誤出現(xiàn)。然后根據(jù)提示輸入數(shù)據(jù),

30、得出正確的結(jié)果??傮w來說,在整個(gè)的課程設(shè)計(jì)過程中,我又重新鞏固了微機(jī)原理與接口技術(shù)這門課程的許多知識(shí),包括數(shù)據(jù)的轉(zhuǎn)換、DOS的調(diào)用和字符串大小寫的轉(zhuǎn)化等等。雖然平時(shí)理論學(xué)習(xí)已經(jīng)接觸了許多類似這樣的題目,但是真正動(dòng)手做起來還是感覺完全不一樣,并不是寫寫畫畫就能完成,而是真正將程序輸入軟件中不斷調(diào)試找出錯(cuò)誤得到最終結(jié)果,在看似簡(jiǎn)單的過程中收獲了許多以往課本上學(xué)不到的經(jīng)驗(yàn)和知識(shí)。對(duì)于MFPCI98這個(gè)匯編軟件我本來有了一定的熟悉和了解,知道如何來操作它,通過它來實(shí)現(xiàn)匯編語句的功能。在這次課程設(shè)計(jì)過程中,我將理論與實(shí)踐結(jié)合,不僅僅是調(diào)用軟件中已經(jīng)存在的程序了,而是自己創(chuàng)建新文件再進(jìn)行匯編。通過這樣的實(shí)

31、踐讓我對(duì)所學(xué)的理論知識(shí)更加理解,更加明白。因?yàn)橹皇峭ㄟ^學(xué)習(xí)課本上的知識(shí),在實(shí)際應(yīng)用中不能很好的運(yùn)用,而借助這個(gè)軟件我可以更好的運(yùn)用,也能更好的鍛煉自己。參考文獻(xiàn)1 周佩玲 彭虎 傅忠謙.微機(jī)原理與接口技術(shù).北京:電子工業(yè)出版社,2007 2 馮繼超.微機(jī)原理實(shí)驗(yàn)指導(dǎo)書.武漢:武漢理工大學(xué)教材中心,20083 李超.計(jì)算機(jī)三級(jí)PC技術(shù).北京:高等教育出版社,1994 4 李亮.關(guān)于匯編語言的編程.北京:北京大學(xué)出版社,20035 周佩玲 彭虎 傅忠謙. 微機(jī)原理與接口技術(shù)學(xué)習(xí)指導(dǎo).北京:電子工業(yè)出版社,2008附錄一 源程序及注釋DATA SEGMENT INPUT1DB 0AH , '

32、PLEASE INPUT A NUMBER(LESS THAN 5 FIGURES):$'輸入A字符INPUT2DB 0AH , 'PLEASE INPUT B NUMBER(LESS THAN 5 FIGURES):$'輸入B字符QUIT DB 0AH, 'ENTER Q OR q TO QUIT:$' ;退出程序IN_ASC_BUF DB 6 ;十進(jìn)制數(shù)的輸入緩沖區(qū),共可接收6個(gè)字符 DB ? ;保留,用于10號(hào)調(diào)用時(shí)DOS填入實(shí)際輸入字符個(gè)數(shù) DB 6 DUP(?) ;一個(gè)符號(hào)位,四位數(shù)字ASCII碼,加上一個(gè)回車符,共計(jì)6字符B_BUF1 DW

33、? ;一個(gè)數(shù)轉(zhuǎn)換為二進(jìn)制后,放于此處OUTPUT DB 0AH , 'THE SUM IS:' , '$'OUT_ASC_SUM DB 6 DUP(?) , '$' ;將二個(gè)數(shù)的和轉(zhuǎn)換為ASCII碼后,放于此處, ;以供9號(hào)調(diào)用顯示DATA ENDSCODE SEGMENT ASSUME CS:CODE , DS:DATAsl PROC FARSTART: MOV AX , DATA MOV DS , AX MOV DX , OFFSET INPUT1 MOV AH , 9 ;多字符輸出到屏幕 INT 21H ;提示輸入一個(gè)數(shù) MOV DX ,

34、OFFSET IN_ASC_BUF MOV AH,0AH ;多字符輸入 INT 21H ;讀取第一個(gè)數(shù) CALL ASC_TO_BIN ;轉(zhuǎn)換第一個(gè)數(shù)為二進(jìn)制 MOV B_BUF1 , AX ;保存第一個(gè)數(shù) MOV DX , OFFSET INPUT2 MOV AH , 9 INT 21H ;提示輸入一個(gè)數(shù) MOV DX , OFFSET IN_ASC_BUF MOV AH , 0AH INT 21H ;讀取第二個(gè)數(shù) CALL ASC_TO_BIN ; 轉(zhuǎn)換第二個(gè)數(shù)為二進(jìn)制 ADD AX , B_BUF1 ;計(jì)算這二個(gè)數(shù)之和 CALL BIN_TO_ASCII ;將和轉(zhuǎn)換為ASCII碼,以供顯

35、示用 MOV DX , OFFSET OUTPUT MOV AH , 9 ;多字符輸出 INT 21H MOV DX , OFFSET OUT_ASC_SUM ;將二個(gè)數(shù)的和轉(zhuǎn)換為ASCII碼后,放于此處, ;以供9號(hào)調(diào)用顯示 MOV AH , 9 INT 21H ;輸出總和MOV DX,OFFSET QUIT MOV AH , 9 INT 21HMOV AH , 1 INT 21H CMP AL,'Q' ;是否輸入QJZ OVERCMP AL,'q' ;是否輸入qJZ OVERJMP STARTOVER: MOV AH , 4CH ;結(jié)束 INT 21Hsl

36、ENDPASC_TO_BIN PROC ;ASCII碼轉(zhuǎn)換為二進(jìn)制數(shù);入口:十進(jìn)制數(shù)的ASCII碼在IN_ASC_BUF內(nèi);出口:轉(zhuǎn)換后的二進(jìn)制數(shù)在AX內(nèi);算法:先將其轉(zhuǎn)換成十進(jìn)制數(shù)字,再用累加和乘10加X的方法變成二進(jìn)制數(shù),如將;358轉(zhuǎn)換為二進(jìn)制數(shù),可先將累加和賦0,再計(jì)算(0*10+3)*10+5)*10+8),結(jié)果為二;進(jìn)制數(shù),再由符號(hào)位決定是否需要求補(bǔ)。 MOV CL , IN_ASC_BUF+1 ;取字符個(gè)數(shù) MOV CH , 0 DEC CL ;扣除符號(hào)位 MOV BX , OFFSET IN_ASC_BUF+3 ;調(diào)整BX指向十進(jìn)制數(shù)的最高位 PUSH BX PUSH CXL1

37、: MOV AL , BX AND AL , 0FH MOV BX , AL INC BX LOOP L1 ;將所有數(shù)字字符的高四位清0,使之變?yōu)閿?shù)字值 POP CX POP BX MOV AX , 0 ;累加和賦初值 MOV SI , 10L2: MUL SI ADD AL , BX ADC AH , 0 INC BX LOOP L2 ;累加乘10 CMP IN_ASC_BUF+2 , '+' JZ L3 ;符號(hào)是正號(hào),轉(zhuǎn)移 NEG AX ;符號(hào)是負(fù)號(hào),求補(bǔ)L3: RETASC_TO_BIN ENDPBIN_TO_ASCII PROC ;將二進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)十進(jìn)制數(shù)數(shù)字的ASCII碼;入口:二進(jìn)制數(shù)在AX內(nèi);出口:轉(zhuǎn)換后的ASCII碼在OUT_ASC_SUM變量內(nèi);算法:AX中的數(shù)范圍在+32767到-32768之間,先檢查AX中的符號(hào)位,以決定輸出“+”;還是“-”,若是負(fù)數(shù),應(yīng)先求補(bǔ),得到原碼后即可與正數(shù)作統(tǒng)一處理。轉(zhuǎn)換方法為將被轉(zhuǎn)換的;二進(jìn)制數(shù)先除以10000,商;即為萬位數(shù),再將余數(shù)除以1000,商為千位數(shù),以此

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論