《微機原理與接口技術》課程設計說明書英文字母大小寫轉換程序設計
武漢理工大學微機原理與接口技術課程設計說明書課程設計任務書學生姓名: * 專業(yè)班級: 電信0801班 指導教師: * 工作單位: 信息工程學院 題 目:英文字母大小寫轉換程序設計初始條件:具備數字電路的理論知識;具備微機原理的理論知識和實踐能力;熟悉匯編語言編程技術;熟悉80X86的CPU結構和指令系統;熟悉相關常用接口電路的設計使用方法。要求完成的主要任務:(包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)1、輸入英文字母串,在回車后實現大小寫轉換2、按命令要求將字符串轉換為全部大寫或全部小寫3、非英文字母不允許輸入并聲響報警4、程序采用匯編語言在PC機上完成5、完成符合學校要求的設計說明書時間安排:一周,其中2天程序設計,2天程序調試,1天完成課程設計報告書及答辯指導教師簽名: 年 月 日系主任(或責任教師)簽名: 年 月 日目 錄摘要I1 DOS功能調用12總體方案論證43程序流程圖及程序設計分析53.1主程序設計53.1.1流程圖及其分析53.1.2程序設計63.2 chos字符串轉換子程序設計83.2.1流程圖及其分析.83.2.2程序設計93.3小寫轉大寫子程序設計113.3.1流程圖及其分析113.3.2程序設計123.4大寫轉小寫子程序設計133.4.1流程圖及其分析133.4.2程序設計144 總程序155 課程設計心得體會20參考文獻21摘 要匯編語言是用指令的助記符、符號地址、標號等書寫程序的語言,實際上是機器語言的一種符號表示,主要特點是可以使用助記符來表示機器指令的操作碼和操作數,可以用標號和符號來代替地址、常量和變量。匯編語言是能夠利用計算機所有硬件特性進而直接控制硬件的唯一語言。本次課程設計的任務是用匯編語言做一個英文字母大小寫轉換程序,按照用戶的要求完成對輸入數據的大寫或者小寫轉換。先輸入要轉換的數據,再對數據進行檢驗判斷其合法性,對不合法的數據進行警報并重新輸入數據,對合法的數據按照要求進行大寫或者小寫轉換,最后顯示轉換后的字符串。關鍵詞:DOS功能調用 大寫英文 小寫英文 轉換 1 DOS功能調用在進行設計之前,先要弄清楚INT 21H軟中斷的DOS功能調用。MS DOS操作系統為程序設計者提供了可以直接調用的軟中斷處理程序,每一個中斷處理程序完成一個特定的功能操作。依據編程需要選擇適當的處理程序,編程者不需再重新編寫程序,而是使用INT n軟中斷指令。每執(zhí)行一種不同類型碼n的軟中斷指令,就執(zhí)行一個中斷處理程序,其主要功能如下。 磁盤的讀/寫控制。 內存管理、文件操作和目錄管理。 基本輸入/輸出(對鍵盤、打印機和顯示器等)控制,另外還有日期、時間管理等。 當類型碼n05H1FH時,調用BIOS的中斷處理程序;類型碼n20H3FH時,調用DOS的中斷處理程序,這次課程設計使用的是DOS中斷處理程序。INT 21H軟中斷是一個具有幾十種功能的大型中斷服務程序,給這些子功能程序分別予以編號,稱為功能號。每個功能程序完成一種特定的操作和處理。對INT 21H軟中斷指令對應的功能子程序的調用稱為DOS系統功能調用。調用系統功能子程序時,不必了解所使用設備的物理特性、接口方式及內存分配等,也不必編寫繁瑣的控制程序,這樣給應用者帶來了很大的方便。 應用INT 21H系統功能調用的方法如下。 入口參數送指定的寄存器或內存。 功能號送AH中。 執(zhí)行INT 21H軟中斷指令。 有的子功能程序不需要入口參數,但大部分需要把參數送入指定位置。程序員只要給出這三方面的信息,不必關心程序具體如何執(zhí)行,在內存中的存放地址如何,DOS就會根據所給的參數信息自動轉入相應的子程序去執(zhí)行并產生相應結果。下面介紹常用的功能調用。(1) 鍵盤輸入并顯示(1號功能調用) 格式: MOV AH, 01H INT 21H 功能:按下任何鍵,將其對應字符的ASCII碼送入AL中,并在屏幕上顯示該字符。如果按下的是CtrlBreak組合鍵,則終止程序執(zhí)行。1號功能調用無須入口參數,出口參數在AL中。 (2) 鍵盤輸入但不顯示輸入字符(8號功能調用) 格式: MOV AH, 08H INT 21H功能:同1號功能調用,但字符不在屏幕上顯示。 (3) 屏幕顯示一個字符(2號功能調用) 格式: MOV DL, 字符 MOV AH, 02H INT 21H 功能:將置入DL寄存器中的字符在屏幕上顯示輸出。 (4) 打印輸出(5號功能調用) 格式: MOV DL, 字符 MOV AH, 05H INT 21H 功能:將置入DL寄存器中的字符送打印機接口,打印輸出。 (5) 屏幕顯示字符串(9號功能調用) 格式: MOV DX, 字符串的偏移地址 MOV AH, 09H INT 21H功能:在屏幕上顯示字符串。 在使用9號功能調用時,應當注意以下問題。 待顯示的字符串必須先放在內存一數據區(qū)(DS段)中,且以$符號作為結束標志。 應當將字符串首地址的段基址和偏移地址分別存入DS和DX寄存器中。 (6) 字符串輸入功能調用(0AH號功能調用) 格式: MOV DX, 已定義緩沖區(qū)的偏移地址 MOV AH, 0AH INT 21H功能:從鍵盤接收字符,并存放到內存緩沖區(qū)。在使用0AH號功能調用時,應當注意以下問題。 執(zhí)行前先定義一個輸入緩沖區(qū),緩沖區(qū)內第一個字節(jié)定義為允許最多輸入的字符個數,字符個數應包括回車符0DH在內,不能為“0”值。第二個字節(jié)保留,在執(zhí)行程序完畢后存入輸入的實際字符個數。從第三個字節(jié)開始存入從鍵盤上接收字符的ASCII碼。若實際輸入的字符個數少于定義的最大字符個數,則緩沖區(qū)其他單元自動清0。若實際輸入的字符個數大于定義的字符個數,其后輸入的字符丟棄不用,且響鈴示警,一直到輸入回車鍵為止。整個緩沖區(qū)的長度等于最大字符個數再加2。 應當將緩沖區(qū)首地址的段基址和偏移地址分別存入DS和DX寄存器中。 (7) 返回DOS操作系統(4CH號功能調用) 格式: MOV AH, 4CH INT 21H功能:終止當前程序的運行,并把控制權交給調用的程序,即返回DOS系統,屏幕出現DOS提示符,如“C: >”,等待DOS命令。 除了這幾種功能調用,還有其他的,這里就不再一一介紹了。2總體方案論證該課程設計的任務是做一個英文字母大小寫轉換程序,完成對輸入數據的大寫或者小寫轉換。輸入部分:在輸入之前,先利用INT 21H的9號功能調用輸出顯示輸入字符串提示符please input the string:再利用INT 21H的8號功能調用輸入字符串(在屏幕上并不顯示)。由于鍵盤輸入的并不一定是英文字母,所以要對輸入的每一個字符進行判別,如果輸入的字符串都是英文字符則進行大小寫轉換,并將字符串存儲到緩沖區(qū),且將字符輸出顯示到屏幕上;如果輸入的字符串中有非英文字符,則產生報警聲并返回重新輸入數據,直至輸入的字符符合要求為止。轉換部分:由于要求要有兩種轉換方式,即大寫字母轉換為小寫字母或者由小寫字母轉換為大寫字母,所以要求用戶在進行轉換前輸入提示要轉換的方法。為解決這個問題,先利用INT 21H的9號功能調用輸出顯示轉換方法選擇提示符please choose the type to output(1or2): ,1為Uppercase,2為Lowercas。再利用INT 21H的8號功能調用輸入1或者2(在屏幕上并不顯示)。如果此時輸入為1,則進行字符串小寫轉大寫的轉換,如果此時輸入為2,則進行字符串大寫轉小寫的轉換。輸出部分:先利用INT 21H的9號功能調用輸出顯示輸出提示符the result is:,再利用INT 21H的9號功能調用輸出顯示轉換后的字符串。3程序流程圖及程序設計分析3.1主程序設計3.1.1流程圖及其分析主程序的流程圖如圖3-1所示.開始字符存儲到BUFFER中發(fā)出警報聲 字符輸出 輸入字符串輸出字符串輸入提示符 結束判斷字符中是否為回車?N判斷字符是否為az或者AZ?調用子程序chos完成字符大小寫轉換SI增1轉換結果輸出換行輸出輸出結果提示符0賦值給SI寄存器YNY圖3-1 主程序流程圖首先在屏幕上輸出顯示字符串輸入提示符,再進行字符串的輸入,然后對輸入的第一個字符進行判別。如果該字符不等于0DH,則繼續(xù)判斷該字符是否為英文字符。如果結果為否則產生報警聲并返回重新輸入數據,直至輸入的字符符合要求為止;如果結果為是則將字符存儲到緩沖區(qū),并將字符輸出顯示到屏幕上。然后進行下一個字符的判別,直至出現一個字符等于0DH,此時字符串驗證完畢,調用子程序chos進行字符串的大小寫轉換,轉換完后結果輸出顯示到屏幕上,并結束程序。3.1.2程序設計程序如下:start: mov ax,data mov ds,ax mov ah,9 ;輸出顯示輸入提示符:please input the string: lea dx,ms1 int 21h mov si,0 ;源串偏移地址SI置0again: mov ah,8 ;輸入字符串 int 21h cmp al,13 ;將AL與0DH進行比較,若相等,則轉移到CHANGE je change cmp al,41h ;將AL與A進行比較,若AL小于A,則轉移到SING jb sing cmp al,5bh ;將AL與Z進行比較,若AL小于等于Z,則轉移到CHG jb chg cmp al,61h ;將AL與a進行比較,若AL小于a,則轉移到SING jb sing cmp al,7bh ;將AL與z進行比較,若AL小于等于z,則轉移到CHG jb chgsing: ;輸入為非英文字母,發(fā)出警報,并重新輸入 mov ah,2 mov dl,07h int 21h jmp againchg: ;將英文字母存入緩沖區(qū),并在屏幕中顯示 mov buffer+si,al mov dl,al mov ah,2 int 21h inc sijmp againchange: ;轉換過程 mov buffer+si,$ call chos ;調用chos子程序 mov ah,2 mov dl,10 ;回車 int 21h mov dl,13 ;換行 int 21h mov ah,9 ;輸出顯示輸出提示符 lea dx,ms2 int 21h mov ah,9 lea dx,buffer ;屏幕顯示轉換結果 int 21h mov ah,1 int 21h mov ah,4ch ;結束程序 int 21h 3.2 chos字符串轉換子程序設計3.2.1流程圖及其分析chos字符串轉換子程序的流程圖如圖3-2所示 開始 輸入字符將AX,DX存入堆棧返回判斷字符是否為1?判斷字符是否為2調用子程序aa,完成字符由小寫轉為大寫DX,AX內容出棧換行輸出轉換方法選擇提示符:1為轉換為大寫,2為轉換為小寫調用子程序ba,完成字符由大寫轉為小寫YNNY圖3-2 chos子程序流程圖首先,應該把斷點地址及一些寄存器的值壓入堆棧,保護現場。在屏幕上輸出轉換方法選擇提示符,用戶根據需要輸入數據1或者2。若輸入的數據為1則調用子程序aa,完成字符串由小寫轉換為大寫;若輸入的數據是2則調用子程序ba,完成字符串由大寫轉換為小寫。轉換完了以后,把斷點地址及一些寄存器的值彈出堆棧,最后返回主程序。3.2.2程序設計程序如下:chos proc ;chos子程序 push ax ;AX,DX入棧 push dx mov ah,2 mov dl,10 ;回車 int 21h mov dl,13 ;換行 int 21h mov ah,9 ;屏幕顯示轉換方法選擇提示符 lea dx,ms3int 21hre: mov ah,8 ;輸入數據1或者2,但不顯示 int 21h cmp al,31H ;輸入為1,程序轉移至UPje up cmp al,32H ;輸入為2,程序轉移至LO je lo mov ah,2 ;輸入不為1也不為2時,發(fā)出警報,并重新輸入數據 mov dl,7 int 21h jmp reup: call aa ;調用子程序aa jmp out1lo: call ba ;調用子程序baout1: pop dx ;DX,AX出棧 pop ax ret ;返回主程序chos endp3.3小寫轉大寫子程序設計3.3.1流程圖及其分析小寫轉大寫子程序的流程圖如圖3-3所示 開始 將SI的值賦給CX,將0賦給DI將AX,CX,DI存入堆棧返回判斷字符是否為為大寫?DI的值增1將字符轉化為大寫,并存儲取代原來的字符取BUFFER中的字符CX的值減1判斷CX是否為0?YAX,CX,DI出棧YNN圖3-3 小寫轉大寫子程序aa的流程圖首先,應該把斷點地址及AX,CX,DI寄存器壓入堆棧,保護現場。再將SI的值賦給CX,將0賦給DI。取出BUFFER單元中的字符,并判斷該字符是否為大寫的英文字母,如果是,則不必進行轉換;如果不是,則將小寫字母轉化為大寫字母并替代原來的小寫字母。循環(huán)判斷其他的字符,直至CX的值為0,結束循環(huán),返回主程序。3.3.2程序設計程序如下:aa proc ;子程序aa push ax ;AX,CX,DI入棧 push cx push di mov cx,si ;CX=SI mov di,0 ;DI=0top1: mov al,buffer+di cmp al,61h ;將AL與a進行比較,若AL小于a,則程序轉移到NE1 jb ne1 sub al,20h ;小寫字母轉換為大寫字母 mov buffer+di,al ;保存轉換后的大寫字母ne1:inc di ;DI增1loop top1 ;循環(huán)返回TOP1 pop di ;AX,CX,DI出棧 pop cx pop ax ret ;返回aa endp3.4大寫轉小寫子程序設計3.4.1流程圖及其分析大寫轉小寫子程序的流程圖如圖3-4所示 開始 將SI的值賦給CX,將0賦給DI將AX,CX,DI存入堆棧返回判斷字符是否為為小寫?DI的值增1將字符轉化為小寫,并存儲取代原來的字符取BUFFER中的字符CX的值減1判斷CX是否為0?NAX,CX,DI出棧YNY圖3-4 大寫轉小寫子程序ba的流程圖首先,應該把斷點地址及AX,CX,DI寄存器壓入堆棧,保護現場。再將SI的值賦給CX,將0賦給DI。取出BUFFER單元中的字符,并判斷該字符是否為小寫的英文字母,如果是,則不必進行轉換;如果不是,則將大寫字母轉化為小寫字母并替代原來的大寫字母。循環(huán)判斷其他的字符,直至CX的值為0,結束循環(huán),返回主程序。3.4.2程序設計程序如下:ba proc ;子程序ba push ax ;AX,CX,DI入棧 push cx push di mov cx,si ;CX=SI mov di,0 ;DI=0top: mov al,buffer+di cmp al,5Ah ;將AL與Z進行比較,若AL大于Z,則程序轉移到NE ja ne add al,20h ;大寫字母轉換為小寫字母 mov buffer+di,al ;保存轉換后的小寫字母ne: inc di ;DI增1 loop top ;循環(huán)返回TOP pop di ;AX,CX,DI出棧 pop cx pop ax ret ;返回ba endp4總程序總程序如下:data segment ms1 db please input the string:,10,13,$ ms2 db the result is:,10,13,$ ms3 db please choose the type to output(1or2):,10,13 db 1.Uppercase,9,2.Lowercase$ buffer db 200 dup (0)data endsstack segment db 200 dup (?)stack endscode segment assume cs:code,ds:data,ss:stackstart: mov ax,data mov ds,ax mov ah,9 lea dx,ms1 int 21h mov si,0 again: mov ah,8 int 21h cmp al,13 je change cmp al,41h jb sing cmp al,5bh jb chg cmp al,61h jb sing cmp al,7bh jb chgsing: mov ah,2 mov dl,07h int 21h jmp againchg: mov buffer+si,al mov dl,al mov ah,2 int 21h inc si jmp againchange: mov buffer+si,$ call chos mov ah,2 mov dl,10 int 21h mov dl,13 int 21h mov ah,9 lea dx,ms2 int 21h mov ah,9 lea dx,buffer int 21h mov ah,1 int 21h mov ah,4ch int 21h ;= chos proc push ax push dx mov ah,2 mov dl,10 int 21h mov dl,13 int 21h mov ah,9 lea dx,ms3 int 21hre: mov ah,8 int 21h cmp al,31H je up cmp al,32H je lo mov ah,2 mov dl,7 int 21h jmp reup: call aa jmp out1lo: call baout1: pop dx pop ax retchos endp;= ba proc push ax push cx push di mov cx,si mov di,0top: mov al,buffer+di cmp al,5Ah ja ne add al,20h mov buffer+di,al ne: inc di loop top pop di pop cx pop ax retba endp;=aa proc push ax push cx push di mov cx,si mov di,0top1: mov al,buffer+di cmp al,61h jb ne1 sub al,20h mov buffer+di,al ne1: inc di loop top1 pop di pop cx pop ax retaa endpcode endsend start5 課程設計心得體會經過這幾天的微機原理課程設計,我覺得學習像微機原理與接口技術這樣實用的知識,不僅要掌握書本上的基本內容,還要靈活思考,善于變換,這樣才能找到最優(yōu)設計,達到事半功倍的效果。課程設計是培養(yǎng)學生綜合運用所學知識,發(fā)現,提出,分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對學生實際工作能力的具體訓練和考察過程?;仡櫰鸫舜挝C原理課程設計,至今我仍感慨頗多,的確,從選題到定稿,從理論到實踐,在整整一個星期的日子里,可以說得是苦多于甜,但是可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。其次,以前對于編程工具的使用還處于一知半解的狀態(tài)上,但是經過一段上機的實踐,對于怎么去排錯、查錯,怎么去看每一步的運行結果,怎么去了解每個寄存器的內容以確保程序的正確性上都有了很大程度的提高。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固。在設計中遇到了很多編程問題,但最后經過自己的努力完成了這次課設。這讓我明白了只要有恒心,有耐心,就可以達到自己的目標,完成任務!參考文獻1 王萍主編. 微機原理應用實踐. 機械工業(yè)出版社,2001.52 錢曉捷主編. 新版匯編語言程序設計. 電子工業(yè)出版社,2007.13 朱定華主編. 微機原理與接口技術學習指導. 清華大學出版社,2004.74 姚燕南、薛鈞義主編. 微型計算機原理與接口技術. 高等教育出版社,2004.115 何小海、嚴華主編. 微機原理與接口技術. 科學出版社,2006.96 徐建民、王東主編. 匯編語言程序設計. 電子工業(yè)出版社,2005.97 周佩玲、彭虎等主編. 微機原理與接口技術(基于16位機). 電子工業(yè)出版社,2007.624