DATAS SEGMENT
BUFFERA DB 32
DB 0
DB 32 DUP(0)
BUFFERB DB 32
DB 0
DB 32 DUP(0)
PROMPTSTRINGA DB 'input A string:',0AH,0DH,'$'
PROMPTSTRINGB DB 'input B string:',0AH,0DH,'$'
PROMPTSTRINGENTER DB 0AH,0DH,'$'
FOUNDSTRING DB 'FOUND IT',0AH,0DH,'$'
NOTFOUNDSTRING DB 'NOT FOUND IT',0AH,0DH,'$'
flag db ?
DATAS ends
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS
START:
mov AX,DATAS
mov DS,AX
MOV DX,OFFSET PROMPTSTRINGA;列印輸入提示
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERA;輸入字串1
MOV DS,DX
MOV DX,OFFSET BUFFERA;輸出輸入的字串
MOV AH,0AH
INT 21H
MOV DX,OFFSET PROMPTSTRINGENTER;回車換行
MOV AH,09H
INT 21H
MOV DX,OFFSET PROMPTSTRINGB;列印輸入提示
MOV AH,09H
INT 21H
MOV DX,SEG BUFFERB;輸入字串2
MOV ES,DX
MOV DX,OFFSET BUFFERB;列印字串2
MOV AH,0AH
INT 21H
MOV DX,OFFSET PROMPTSTRINGENTER;回車換行
MOV AH,09H
INT 21H
mov BX,offset PROMPTSTRINGA
mov AX,offset PROMPTSTRINGB
dec AX
while1: ;while1判斷字串2的首字母與字串1 的哪一個首字母相等
mov si,AX ;si存放目標字串1的偏移地址
mov di,BX ;di存放帶判斷字串2的偏移地址
inc si
inc AX
xor cx,cx
mov ch,[si] ;ch存放字串1中的一個字符
mov cl,[di] ;cl存放字串2中的一個字符
cmp ch,0
jz flag0 ;判斷是否已經為最后一個字符,如果是則跳轉
cmp ch,cl
jnz while1
while2: ;while2判斷字串2的其余字母與字串1 的其余字母是否相等
inc di
inc si
inc dx ;si di自增判斷其余字符
xor cx,cx
mov ch,[si] ;ch存放字串1中的一個字符
mov cl,[di] ;cl存放字串2中的一個字符
cmp cl,0
jz flag1 ;字串2已經到最后一個字符說明相等
cmp ch,0 ;字串1已經是最后一個字符
jz flag0
cmp ch,cl
jz while2 ;如果兩個字符相等則繼續回圈判斷一個字符
jnz while1 ;不等則進行回圈1
flag0:
MOV DX,OFFSET NOTFOUNDSTRING
MOV AH,09H
INT 21H
JMP ENDPRO;結束程式
flag1:
MOV DX,OFFSET FOUNDSTRING;輸出found
MOV AH,09H
INT 21H
JMP ENDPRO;結束程式
ENDPRO: MOV AX,4C00H
INT 21H
CODES ends
end START
為什么這個總是顯示not found ,不能顯示found?比較的代碼是借鑒https://www.cnblogs.com/roseAT/p/10250320.html。
uj5u.com熱心網友回復:
while1: 前面對 ax 和 bx 的設定不對吧,設定到了提示字串上了,應該是在輸入字串 BUERRA/B 那里吧;其次,比較方法,可能要先看兩字串長度是否一樣,若不一樣,就不用比了,一樣則繼續但字串結束不是 00 而是 0dh(輸入功能造成的)。uj5u.com熱心網友回復:
抱歉,上面的后面比較部分的想法錯了,想成立字串是否相同的比較了,題意的要求是子串比較吧。uj5u.com熱心網友回復:
DATAS SEGMENT確實錯了,現在改過來了還是不對,比較兩個相同的字串時能輸出FOUNE但是字串不行。
BUFFERA DB 32
DB 0
DB 32 DUP(0)
BUFFERB DB 32
DB 0
DB 32 DUP(0)
PROMPTSTRINGA DB 'input A string:',0AH,0DH,'$'
PROMPTSTRINGB DB 'input B string:',0AH,0DH,'$'
PROMPTSTRINGENTER DB 0AH,0DH,'$'
FOUNDSTRING DB 'FOUND IT',0AH,0DH,'$'
NOTFOUNDSTRING DB 'NOT FOUND IT',0AH,0DH,'$'
DATAS ends
CODES SEGMENT
ASSUME CS:CODES, DS:DATAS
START:
mov AX,DATAS
mov DS,AX
MOV DX,OFFSET PROMPTSTRINGA;列印輸入提示
MOV AH,09H
INT 21H
mov ah,0ah
MOV DX,SEG BUFFERA;輸入字串1
MOV DS,DX
MOV DX,OFFSET BUFFERA;輸出輸入的字串
MOV AH,0AH
INT 21H
MOV DX,OFFSET PROMPTSTRINGENTER;回車換行
MOV AH,09H
INT 21H
MOV DX,OFFSET PROMPTSTRINGB;列印輸入提示
MOV AH,09H
INT 21H
mov ah,0ah
MOV DX,SEG BUFFERB;輸入字串2
MOV ES,DX
MOV DX,OFFSET BUFFERB;列印字串2
MOV AH,0AH
INT 21H
MOV DX,OFFSET PROMPTSTRINGENTER;回車換行
MOV AH,09H
INT 21H
mov BX,OFFSET BUFFERB
mov AX,OFFSET BUFFERA
dec AX
while1:
mov si,ax
mov di,bx
inc si
inc AX
xor cx,cx
mov ch,[si] ;ch存放字串1中的一個字符
mov cl,[di] ;cl存放字串2中的一個字符
cmp ch,0
jz flag0 ;判斷是否已經為最后一個字符,如果是則跳轉
cmp ch,cl
jnz while1
while2: ;while2判斷字串2的其余字母與字串1 的其余字母是否相等
inc di
inc si
inc dx ;si di自增判斷其余字符
xor cx,cx
mov ch,[si] ;ch存放字串1中的一個字符
mov cl,[di] ;cl存放字串2中的一個字符
cmp cl,0
jz flag1 ;字串2已經到最后一個字符說明相等
cmp ch,0 ;字串1已經是最后一個字符
jz flag0
cmp ch,cl
jz while2 ;如果兩個字符相等則繼續回圈判斷一個字符
jnz while1 ;不等則進行回圈1
flag0:
MOV DX,OFFSET NOTFOUNDSTRING
MOV AH,09H
INT 21H
JMP ENDPRO;結束程式
flag1:
MOV DX,OFFSET FOUNDSTRING;輸出found
MOV AH,09H
INT 21H
JMP ENDPRO;結束程式
ENDPRO: MOV AX,4C00H
INT 21H
CODES ends
end START
uj5u.com熱心網友回復:
字串結束應和 0dh 比較而非原來的 00(共有三個地方吧),這個還是對的,除非在比較之前,把輸入緩沖區里的 0dh 變換為 00 。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/235753.html
標籤:匯編語言
上一篇:還是正則運算式的問題
