汇编小程序:字符串匹配

实验内容:编写程序实现两个字符串比较。如果相同,则屏幕显示“MATCH”,否则屏幕显示“NOMATCH”

DATAS SEGMENT
PRODUCTION DB        'Welcome to the system!',13,10,13,10


DB        'The function of the program is judging 2 strings same or not.',13,10
DB        'If the 2 strings are the same,the scream will show "Match",or else,show "No match".',13,10,13,10
DB        'Best wishes!',13,10,13,10,'$'
MESSAGE1 DB        'Please enter the first string.',13,10,'$'
MESSAGE2 DB        'Please enter the second string.',13,10,'$'
CR DB        13,10,'$'   ;回车换行
MATCH DB        'Match!$'
NOMATCH   DB        'No Match!$'
STRING1    DB        100
DB        ?
DB        100   DUP(0)
STRING2      DB        100
DB        ?
DB        100   DUP(0)
AGAIN DB        'Do you want to try again?(Y or N)',13,10,'$'
ERROR DB        'ERROR!',13,10,'Please enter the right commonds.',13,10,'$' ;错误提示
DATAS ENDS

CODES SEGMENT
MAIN PROC      FAR
ASSUME    CS:CODES, DS:DATAS, ES:DATAS
START:
HEAD: PUSH      DS
MOV       AX,0
PUSH      AX
MOV       AX,DATAS
MOV       DS,AX
MOV       ES,AX

LEA       DX,PRODUCTION
MOV       AH,09H
INT       21H
;以下输入第一个字符串
LEA       DX,MESSAGE1
MOV       AH,09H
INT       21H
LEA       DX,STRING1
MOV       AH,0AH
INT       21H
LEA       DX,CR
MOV       AH,09H
INT       21H

;以下输入第二个字符串
LEA       DX,MESSAGE2
MOV       AH,09H
INT       21H
LEA       DX,STRING2
MOV       AH,0AH
INT       21H
LEA       DX,CR
MOV       AH,09H
INT       21H

LEA       SI,STRING1
LEA       DI,STRING2
ADD       SI,02H
ADD       DI,02H
MOV       CL,[SI-1]

MOV       CH,[DI-1]
CMP       CL,CH
JA        NEXT
MOV       CL,[DI-1]   ;把比较次数输入CX,CX=MAX(LENGTH(STRING1,STRING2))
NEXT: MOV       CH,0H
REPZ CMPSB                 ;字符串比较
MOV       AH,09H      ;Prepare   for   the   INT21H
JNZ       NO_MATCH

MOV       DX,OFFSET MATCH
INT       21H
JMP       EXIT
NO_MATCH: MOV       DX,OFFSET NOMATCH
INT       21H
JMP       EXIT
OVERFLOW:
LEA       DX,CR
MOV       AH,09H
INT       21H
LEA       DX,ERROR
MOV       AH,09H
INT       21H

EXIT:
LEA       DX,CR
MOV       AH,09H
INT       21H
LEA       DX,AGAIN    ;提示是否再试一次
MOV       AH,09H
INT       21H
MOV       AH,01H
INT       21H
PUSH      AX
LEA       DX,CR
MOV       AH,09H
INT       21H
POP       AX
CMP       AL,'Y'
JZ        HEAD
CMP       AL,'y'
JZ        HEAD
CMP       AL,'N'
JZ        OVER
CMP       AL,'n'
JZ        OVER
JMP       OVERFLOW
OVER:
MOV       AH,4CH
INT       21H
RET
MAIN ENDP
CODES ENDS
END       START

没有调整字符对齐,不过无伤大雅。

这个程序设有两个附加功能,即提示错误和提示是否重试一次。有一些汇编程序会在这里出错,只要删掉是否重试即可运行。

其实现在已经很少人在用手动汇编了,主流的方法是把需要的程序用高级语言编号后生成.exe文件,然后用反汇编工具实现。最后如有需要,再用汇编对反汇编得出的结果进行小面积的修改。

 

本文原链接:http://hi.baidu.com/xiamengy/blog/item/c8fec2bfbe1e3b0918d81f2d.html