【文章內(nèi)容簡(jiǎn)介】
字符串 mov ah,09h ; 9 號(hào) DOS 調(diào)用用于輸出制定緩沖區(qū)的字符串 lea dx,string ;將輸出緩沖區(qū)的首地址賦給 dx int 21h endm 字符及字符串的輸入 對(duì)于字符串的輸入我們采用 DOS 調(diào)用的 10號(hào)調(diào)用,用于實(shí)現(xiàn)對(duì)轉(zhuǎn)換字符串的輸入,具體程序如下: lea dx,buffer1 ;設(shè)定輸入字符串存放位置的偏移地址 mov ah,0ah ; 10 號(hào)調(diào)用用于輸入多字符 int 21h 對(duì)于單字符的輸入我們采用 DOS 調(diào)用的 1 號(hào)調(diào)用,用于實(shí)現(xiàn)對(duì)待查詢字母的輸入,具體程序如下: mov ah,01h ; 1 號(hào)調(diào)用用于單字符輸入,輸入字符的 ASCII 碼存放于 al 寄存器中 int 21h 選擇部分 對(duì)于程序中需要選擇的部分,如選擇大寫或小寫,選擇是否查詢,選擇是否退出并用 Y/N 進(jìn)行選擇,我們采用以下程序?qū)崿F(xiàn): choose macro opr1,opr2 mov ah,01h ; 1 號(hào)調(diào)用用于輸入 Y 或 N 武漢理工大學(xué)《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)說(shuō)明書 6 int 21h cmp al,59h ;將輸入的字母的 ASCII 碼與 Y 的 ASCII 碼比較 jz opr1 ;若輸入為 Y 則跳轉(zhuǎn)到 opr1 所指的位置 cmp al,79h ;將輸入的字母的 ASCII 碼與 y 的 ASCII 碼比較 jnz opr2 ;若輸入的 不是 y 則跳轉(zhuǎn)到 opr2 所指的位置 endm 大小寫轉(zhuǎn)換部分 對(duì)于大寫小轉(zhuǎn)換部分,存在許多共性,但在個(gè)別語(yǔ)句上稍有不同,轉(zhuǎn)換為大寫 ASCII碼需要減去 20H,而轉(zhuǎn)換為小寫 ASCII 碼 需要加上 20H, 所以將整個(gè)轉(zhuǎn)換部分分為三個(gè)小部分,分別為 ready、 conversion conversion2,其結(jié)構(gòu)圖如圖 31 所示, 其程序具體如下 : 1) ready macro mov ah,00h mov bx,0000h mov cx,0000h mov dx,0000h ; 以上四句語(yǔ) 句用于將 ah,bx,cx,dx 各寄存器清零 lea bx,buffer1+2 ;將緩沖區(qū) buffer1 開始存放字符串的偏移地址賦給 bx endm 2) conversion1 macro opr1,opr2,opr3 mov al,[bx] ;將緩沖區(qū) buffer1 的字符存入 al 寄存器中 mov dl,[bx] ;將緩沖區(qū) buffer1 的字符存入 dl 寄存器中 cmp al,39。$39。 ;比較輸入是否為空字符串 jz result ;若為空字符串則調(diào)至輸出轉(zhuǎn)換結(jié)果部分 cmp al,opr1 jc opr3 cmp al,opr2 ;以上三句用于確認(rèn)是否為大寫或小寫字母 endm 武漢理工大學(xué)《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)說(shuō)明書 7 3) conversion2 macro opr1 mov 37h[bx],al ;將轉(zhuǎn)換后的大寫或小寫字母的 ASCII 碼存入另外定義的緩沖區(qū) inc cl ; cl 自加 1,用于計(jì)數(shù) inc bl ; bl 自加 1 用于指向下一個(gè)存儲(chǔ)單位的 偏移地址 jmp opr1 ;調(diào)回轉(zhuǎn)換大小寫的語(yǔ)句 endm 對(duì)于大小寫的轉(zhuǎn)換我們通過(guò)以下語(yǔ)句來(lái)進(jìn)行 ASCII 碼的加減 20H: sub al,20h add al,20h 開 始l e a d x , b u f f e r 1 + 2m o v d l , [ b x ]m o v a l , [ b x ]m o v c x , 0 0 0 0 ha l = ’ $ ’ ?a l 7 b h / 5 b h ?a l 6 0 h / 4 0 h ?s u b / a d d a l , 2 0 hm o v 3 7 h [ b x ] , a li n c c li n c b l輸 出 轉(zhuǎn) 換 結(jié) 果查 詢 模 塊i n c c li n c b lYYYNN結(jié) 束退 出 D O SN 圖 31 大小寫轉(zhuǎn)換模塊流程圖 武漢理工大學(xué)《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)說(shuō)明書 8 查詢部分 對(duì)于查詢部分,我們采用另外定義一個(gè)緩沖區(qū)來(lái)存放查詢的結(jié)果,最后則一次性全部輸出,輸出形式為字符出現(xiàn)的字符串位置,如果輸入的字符不存在則查詢結(jié)果顯示為空,并且在每次進(jìn)行下一輪查詢時(shí)自動(dòng)清除緩沖區(qū)里的內(nèi) 容,保證下次輸出的正確性,其流程圖如圖 32 所示,其程序如下: part3: lea si,buffer3 ;將緩沖區(qū) buffer3 的偏移地址賦給 si push si ;將 si 的內(nèi)容推入堆棧段,保護(hù)原數(shù)據(jù) mov cl,09h ;設(shè)置計(jì)數(shù) cl 的初值,用于清零寄存器 clear: mov [si],39。 39。 inc si loop clear ;將緩沖區(qū) buffer3 中已存的數(shù)據(jù)清零,用以繼續(xù)查詢 pop si ;將存入堆棧段的 si 的原值出 棧 mov cl,00h ;計(jì)數(shù)重新清零 print message5 print message3 choose next2,exit1 next2: print message6 mov ah,01h int 21h ready done5: mov dl,[bx] ;取已存的字符串的字符存入 dl 中 cmp dl,39。$39。 ;判斷是否為空字符串或者是否查詢完整個(gè)字符串 jz done6 cmp dl,al ;判斷是否為待查詢的字符 武漢理工大學(xué)《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)說(shuō)明書 9 jz done7 ;若是待查詢的字符則進(jìn)入 done7 指向的相關(guān)語(yǔ) 句 inc bl inc cl jmp done5 ;若不是查詢字符則進(jìn)入下一個(gè)字符進(jìn)行下一次查詢 done6: print message7 print buffer3 ;輸出查詢結(jié)果 jmp part3 done7: inc cl mov [si],cl ;將統(tǒng)計(jì)出現(xiàn)待查詢字符出現(xiàn)次數(shù)存入 si 中 add [si],30h ;將對(duì)應(yīng)內(nèi)容轉(zhuǎn)化為十進(jìn)制數(shù)字形式輸出 inc si inc si inc bl jmp done5 ;返回進(jìn)行下一個(gè)字符的查詢 武漢理工大學(xué)《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)說(shuō)明書 10 N開 始 是 否 查 詢 ?將 b u f f e r 3數(shù) 據(jù) 區(qū) 清 零m o v d l , [ b x ]輸 入查 詢 字 母m o v c x , 0 0 0 0 h d l = ’ $ ’ ?d l = a l ?i n c c li n c b l輸 出查 詢 結(jié) 果i n c c lM o v [ s i ] , c li n c s ii n c s ii n c b l退 出 D O S結(jié) 束YNYYN 圖 32 查詢模塊流程圖 武漢理工大學(xué)《微機(jī)原理與接口技術(shù)》課程設(shè)計(jì)說(shuō)明書 11