读书人

汇编语言关于查找字符串中的小疑点

发布时间: 2012-04-19 14:36:43 作者: rapoo

汇编语言关于查找字符串中的小问题
题目是输入两个字符串,查找长字符串是否包含短字符串

刚刚接触和汇编语言,很菜,请大家指导啊,我写的代码如下,运行不起来啊


ASSUME CS:CODE,DS:DATA,SS:STA
DATA SEGMENT
BUFFERA DB 16
DB 0
DB 16 DUP(0)
BUFFERB DB 16
DB 0
DB 16 DUP(0) ;申请缓存区
INASTRING DB 'input long word:',0DH,0AH,'$' ;定义输入提示的字符串
INBSTRING DB 'input short word:',0DH,0AH,'$';定义输入提示的字符串
ENTERSTRING DB 0DH,0AH,'$'
FOUNDSTRING DB 'find stringb in stringa',0DH,0AH,'$'
NOTFOUNDSTRING DB 'do not find stringb in srtinga',0DH,0AH,'$'
DATA ENDS

STA SEGMENT
DB 16 DUP(0);定义一个栈,来进行暂时保存数据工作
STA ENDS

CODE SEGMENT

START:

MOV AX,STA
MOV SS,AX
MOV SP,16

MOV AH,09H
MOV DX,OFFSET INASTRING
INT 21

MOV DX,SEG BUFFERA
MOV DS,DX
MOV DX,OFFSET BUFFERA
MOV AH,0AH
INT 21 ;输入字符串

MOV AH,09H
MOV DX,OFFSET ENTERSTRING
INT 21

MOV AH,09H
MOV DX,OFFSET INBSTRING
INT 21

MOV DX,SEG BUFFERB
MOV ES,DX
MOV DX,OFFSET BUFFERB
MOV AH,0AH
INT 21 ;输入字符串

MOV AH,09H
MOV DX,OFFSET ENTERSTRING
INT 21 ; 以上显示输入输出



MOV DI,OFFSET BUFFERA ; 获取ab中第一个字母的位置
ADD DI,02H
MOV SI,OFFSET BUFFERB
ADD SI,02H

MOV AL,ES:[SI] ; 将与b的第一个字母相同的a中字母位置放在栈中
MOV CX,DS:[DI-1]
S0:
REPNZ SCASB ;将在a中查询到的与b首字母相同的字幕位置放在栈中
PUSH DI
LOOP S0


MOV BX,ES:[SI-1] ; 将b长度放在bx中
AND BH,00H

MOV AX,16 ;根据栈的指针的变化,求出a中与b首字母相同的字母个数,存放在cx中,作为循环次数
SUB AX,SP
MOV CL,2
DIV CL
AND AH,00H
MOV CX,AX
S1:
POP DI
PUSH CX
PUSH SI
MOV CX,BX
REPZ CMPSB
JCXZ FOUND
POP SI
POP CX
LOOP S1

FOUND:
MOV AH,09H
MOV DX,OFFSET FOUNDSTRING
INT 21

NOTFOUND:
MOV AH,09H
MOV DX,OFFSET NOTFOUNDSTRING
INT 21

MOV AX,4C00H
INT 21H

CODE ENDS


END START


[解决办法]
类似有strstr,可以用最土的一个一个字节比较的算法,你可以先写伪代码。
[解决办法]

探讨
汇编语言 有输入的exe文件如何用t单步调试

[解决办法]
你用 debug 看了吗?看过了的话,一进去就会发现些很严重的问题吧。你代码里,有很多地方的 int 21h 全成了 int 21 即 int 15h 了,漏写了后面的十六进制后缀 h

读书人网 >汇编语言

热点推荐