汇编原理实验 --查找子字符串的位置
生活随笔
收集整理的這篇文章主要介紹了
汇编原理实验 --查找子字符串的位置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實驗2:(子字符串,查找字符串在另一個字符串中出現的位置)
設計算法:將用戶輸入關鍵字和句子,將bx為關鍵字起始位置地址,dx賦初值為句子起始位置地址,將dx和bx內容進行匹配,如果不匹配則dx指向句子下一個字符及inc dx。用di表示當字符匹配成功時bx,dx的偏移量,di賦初值為0,[bx+di]與[dx+di]比較,如果匹配成功di自增1,直到di加到等于關鍵字長度時顯示結果匹配成功,如果中間有匹配不成功di重置為0,直到當整個句子查詢完沒匹配則顯示結果不匹配.
程序實現:調用print子程序,將緩沖區字符串顯示出來,調用cin子程序將用戶輸入字符串存入指定緩沖區。另 cx=句子長度,用bx,dx分別等于關鍵字地址和句子地址按照前面所說的算法來編程。此外,還有一個要求需要顯示當匹配成功時的子字符串位置:匹配的位置等于句子長度-cx,或匹配位置=dx-句子首地址,調用數字輸出子程序。要注意的是:得出來的結果為十進制數字,要想以十六進制格式輸出數字還需要將其轉化成ASCII輸出.
十六進制數字輸出算法;(在附錄中會附上十進制數輸出代碼)具體思路:將數字除以16,將余數壓入棧中,商繼續除以16,得出來的余數再壓入棧中,
重復上述步驟,直到商為0時結束,再將棧頂元素依次推出并輸出(判斷是否小于10,小于10加30H輸出,大于10加31h輸出)。
DATAS SEGMENT;此處輸入數據段代碼 msg db 'enter keyword:$' msg1 db 'enter sentence:$' msg2 db 'NoMatch$' msg3 db 'last Match location at:$' keepcin db 100 cinlen db 0 cinfld db 100 dup(0) keepcin1 db 100 cin1len db 0 cin1fld db 100 dup(0) DATAS ENDSSTACKS SEGMENT;此處輸入堆棧段代碼 STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXmov es,ax;此處輸入代碼段代碼;此處為標題輸出和輸入mov dx,offset msgcall print ;"enter keyword" mov dx,offset keepcincall cin mov dx,offset msg1call print mov dx,offset keepcin1call cin;用戶輸入完成接下來要完成字符串匹配mov bx,offset cinfld ;關鍵字 mov dx,offset cin1fld ;句子mov cl,cin1len ;循環次數為句子長度 mat:call comparestr cmp al,0je matchinc dxloop matjmp noMatch ;遍歷完都沒找到 match:mov dx,offset msg3call print mov al,cin1lensub al,clmov dl,al ;索引從0開始call dispdecjmp stop noMatch: ;沒有查詢到結果mov dx,offset msg2call print stop: MOV AH,4CHINT 21H;以下為子程序 comparestr proc ;dx,bx指向字符串,比較字符串大小,相等為al=0,否則-1push cxpush sipush dimov si,dxmov di,bx ;mov cl,cinlen ;改成字符串長度cld lastagain: cmpsbjnz lastunmatloop lastagain;匹配成功mov al,0jmp lastoutput lastunmat: mov al,-1 lastoutput: pop di pop si pop cxret comparestr endp ;打印固定字符串 print procpush axmov ah,09hint 21hpop axret print endp ;十進制輸出,入口參數dx dispdec procpush axpush bxpush cxpush dxmov ax,dxxor dx,dxmov bx,10mov cx,0 a:cmp ax,10jb okdiv bxadd dl,30hpush dxxor dx,dxinc cxjmp a ok:add al,30hpush axinc cx b:pop dxmov ah,2int 21hloop bpop dxpop cxpop bxpop axret dispdec endp;用戶輸入 cin procpush axmov ah,0AHint 21hpop axcall printnewlineret cin endp ;輸出換行 printnewline procpush axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hpop dxpop axret printnewline endp CODES ENDSEND START
輸出結果如圖:
總結
以上是生活随笔為你收集整理的汇编原理实验 --查找子字符串的位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编原理实验--输出ASCII码10H到
- 下一篇: 汇编原理实验 --类型统计(字母,数字,