汇编语言:两个字符串是否相等的比较。由用户输入两个字符串并判断他们是否相等,两个相等则输出Y,否则输N

DATAS SEGMENT
BUF DB 10H,?,10 DUP(?)
BUF1 DB 10H,?,10 DUP(?)
DATAS ENDS
CODES SEGMENT
ASSUME ES:DATAS,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,BUF
MOV AH,0AH
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV AX,DATAS
MOV DS,AX
LEA DX,BUF1
MOV AH,0AH
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV AX,DATAS
MOV ES,AX
LEA SI,BUF
LEA DI,BUF1
;比较字符串长度是否相等
MOV AL,ES:[SI+1]
MOV BL,DS:[DI+1]
CMP AL,BL
JNZ NO
;比较字符串的内容是否相等
CM:
INC SI
INC DI
MOV AL,ES:[SI]
MOV BL,DS:[DI]
CMP AL,BL
JNZ NO
LOOP CM
NO:
MOV DL,'N'
MOV AH,02H
INT 21H
MOV SI,AX
MOV AH,4CH
INT 21H
CODES ENDS
END START
为什么无论输入的字符串是否相同,输出的结果都是N?求解释,并帮忙改正一下上面的代码。

你的程序中有几处错误:
1. ASSUME伪操作中,漏掉了CS,导致汇编时对转移指令报错。
2. 没有显示Y的指令,所以只显示N。
3. 比较字串内容时没有对计数器进行设置。
4. 比较字串时,起点向前错位了一个字节。
5. 一些其它小的缺陷,比如对段寄存器的赋值应当放在代码前面部分,有一些重复代码和无用代码等。这些不影响本程序的运行结果,所以我未作处理。

修改后的代码如下(修改过的或增加的指令,我在行末加 ;************ 注明):

DATAS SEGMENT
BUF DB 10H,?,10 DUP(?)
BUF1 DB 10H,?,10 DUP(?)
DATAS ENDS
CODES SEGMENT
ASSUME cs:codes, ES:DATAS,DS:DATAS ;************原程序漏掉了CS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,BUF
MOV AH,0AH
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV AX,DATAS
MOV DS,AX
LEA DX,BUF1
MOV AH,0AH
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV AX,DATAS
MOV ES,AX
LEA SI,BUF
LEA DI,BUF1
;比较字符串长度是否相等
MOV AL,ES:[SI+1]
MOV BL,DS:[DI+1]
CMP AL,BL
JNZ NO
;比较字符串的内容是否相等
mov cl, [si+1] ;************设置CX计数
mov ch,0 ;************
inc si ;************调指针指向后面实际输入的字符
inc di ;************

CM:
INC SI
INC DI
MOV AL,ES:[SI]
MOV BL,DS:[DI]
CMP AL,BL
JNZ NO
LOOP CM

mov dl, 'Y' ;************显示‘Y’
mov ah, 2 ;************
int 21h ;************
jmp exit ;************跳过显示‘N’的代码

NO:
MOV DL,'N'
MOV AH,02H
INT 21H

MOV SI,AX ;************这一条指令多余,可删除
exit: ;************
MOV AH,4CH
INT 21H
CODES ENDS
END START
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-30
;MIMA
;==================================
DATA SEGMENT
BUF1 DB 'HAPPY!'
BUF3 DB 10, 13, 'PLEASE INPUT PASSWORD : $'
BUF4 DB 10, 13, 'ERROR ! $'
BUF5 DB 6 DUP(?)
BUF6 DB 10, 13, 'WELLCOM ! $'
COUNT DB 3
DATA ENDS
;----------------------------------
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA
BEG:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
IIII:
MOV AH, 09H
MOV DX, OFFSET BUF3
INT 21H
MOV BX, OFFSET BUF5
MOV CX, 06H
LAST:
MOV AH, 07H
INT 21H
MOV [BX], AL
MOV AH, 02H
MOV DL, '*'
INT 21H
INC BX
LOOP LAST
;--------------------------
MOV DI, OFFSET BUF5
MOV SI, OFFSET BUF1
CLD
MOV CX, 6
REPE CMPSB
JZ GOOD
MOV AH, 09H
MOV DX, OFFSET BUF4
INT 21H
DEC COUNT
JZ EXIT
JMP IIII
GOOD:
MOV AH, 09H
MOV DX, OFFSET BUF6
INT 21H
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END BEG
;==================================

参考一下。
相似回答