读书人

输入一个字符串与另一个字符串比较解决

发布时间: 2012-03-02 14:40:29 作者: rapoo

输入一个字符串与另一个字符串比较
DATAS SEGMENT
mima db 7
db 7 dup(?)
string db "123456"
cout1 db 0dh,0ah,"MATCH","$"
cout2 db 0dh,0ah,"NO MATCH","$";此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX

mov dx,seg mima
mov ds,dx
mov dx,offset mima
mov ah,10
int 21h

lea si,mima
lea di,string
mov bx,[di]

mov cx,6
all: cmp bx,[si]+1
jnz again
inc si
inc bx
loop all

mov ah,09h
mov dx,offset cout1
int 21h
  

again:mov ah,9
mov dx,offset cout2
int 21h ;
MOV AH,4CH
INT 21H
CODES ENDS
END START

即使我输入123456 也只会输出 NO MATCH   求指点

[解决办法]
在那个比较的 cmp 指令上设断点,看看为什么会不对。
首先,数据定义不对。int21h 的 0ah 功能的输入区,你少定义了一个字节。其次,比较逻辑错误,逐字节比较,用 bx 不合适吧;逐字节比较,后来就不管 di 了?
[解决办法]
以前做过的练习,供楼主参考。

Assembly code
assume    cs:code,ds:data,es:datadata    segmentmsg1    db    'Error!$'msg2    db    'Congratulation!$'buff    db    10 dup (0)     ;输入缓冲区pw    db    '123456'       ;密码data    endscode    segmentstart:    mov ax,data    mov ds,ax    mov es,ax    mov cx,3               ;3次输入机会s:    push cx    mov si,offset buff    mov cx,sizeof pw       ;取密码长度s1:    mov ah,8               ;无回显输入    int 21h    mov byte ptr [si],al    mov dl,'*'             ;用*号显示输入字符    mov ah,2    int 21h    inc si    loop s1;回车    mov ah,2    mov dl,13    int 21h    mov dl,10    int 21h;煮字节比较    mov cx,sizeof pw    mov si,offset buff    mov di,offset pw    cld    repz cmpsb    jne jx    jmp okjx:    mov dx,offset msg1    mov ah,9    int 21h        mov ah,2    mov dl,13    int 21h    mov dl,10    int 21h    pop cx    loop s    jmp doneok:    mov dx,offset msg2    mov ah,9    int 21h    done:    mov ah,4ch    int 21hcode    endsend    start
[解决办法]
探讨
DATAS SEGMENT
mima db 7
db 7 dup(?)
string db "123456"
cout1 db 0dh,0ah,"MATCH","$"
cout2 db 0dh,0ah,"NO MATCH","$";此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS……

读书人网 >汇编语言

热点推荐