| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1771 人关注过本帖
标题:查找匹配字符串
只看楼主 加入收藏
ljf253020645
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-11-15
收藏
 问题点数:0 回复次数:3 
查找匹配字符串

datarea segment
string1 db "Enter keyword:$"
string2 db "Enter sentence:$"
string3 db "Match at location:$"
string4 db "No match.",13,10,"$"
string5 db "H of the sentence.$"
keyword db 50d,?,51d dup(?)
sentence db 50d,?,51d dup(?)
datarea ends


code segment
main proc far
assume cs:code,ds:datarea,es:datarea
start:
push ds
sub ax,ax
push ax

mov ax,datarea
mov ds,ax
mov es,ax

lea dx,string1
mov ah,09h
int 21h
lea dx,keyword
mov ah,0Ah
int 21h
mov ah ,02h
mov dl,0ah
int 21h
lea dx,string2
mov ah,09h
int 21h
lea dx,sentence
mov ah,0Ah
int 21h
mov ah,02h
mov dl,0ah
int 21h

lea si,keyword+2
lea di,sentence+2
mov ax,0
mov al,[sentence+1]
mov ah,[keyword+1]
cmp al,ah
jl no
sub al,ah
mov ah,0
mov cx,ax
inc cx

compare:
push cx
mov cx,3
cld
repz cmpsb
jz match
mov ax,3
sub ax,cx
sub si,ax
mov ax,2
sub ax,cx
sub di,ax
lea bx,[di]
pop cx
loop compare
no: lea dx,string4
mov ah,09h
int 21h
jmp exit
match:
lea dx,string3
mov ah,09h
int 21h
sub bx,word ptr sentence
inc bx
call change
lea dx,string5
mov ah,09h
int 21h
exit:
ret
main endp


change proc near
push ax
push bx
push cx
push dx
mov ch,4
mov cl,4
rol bx,cl
mov al,bl
rotate:and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
pop dx
pop cx
pop bx
pop ax
ret
change endp
code ends
end start
查找匹配字符串
程序接收用户键入一个关键字以及一个句子,如果句子不包含关键字则显示“No match"
,如果句子包含关键字则显示match,且把该字在句子中的位置用16进制显示出来,
要求过程如下:
Enter keyword:abc
Enter sentence:We are studying abc.
Match at location :11H of the sentence
帮忙看看有什么错
自己编的

[此贴子已经被作者于2006-11-15 12:26:47编辑过]

搜索更多相关主题的帖子: 字符 
2006-11-15 12:22
wchx215
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2006-9-4
收藏
得分:0 

DATAREA SEGMENT
STRING1 DB "ENTER KEYWORD:$"
STRING2 DB "ENTER SENTENCE:$"
STRING3 DB "MATCH AT LOCATION:$"
STRING4 DB "NO MATCH.",13,10,"$"
STRING5 DB "H OF THE SENTENCE.$"
KEYWORD DB 50D,?,51D DUP(?)
SENTENCE DB 50D,?,51D DUP(?)
DATAREA ENDS


CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATAREA,ES:DATAREA
START:
PUSH DS
SUB AX,AX
PUSH AX

MOV AX,DATAREA
MOV DS,AX
MOV ES,AX

LEA DX,STRING1
MOV AH,09H
INT 21H
LEA DX,KEYWORD
MOV AH,0AH
INT 21H
MOV AH ,02H
MOV DL,0AH
INT 21H
LEA DX,STRING2
MOV AH,09H
INT 21H
LEA DX,SENTENCE
MOV AH,0AH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H

LEA SI,KEYWORD+2 ;关键词
LEA DI,SENTENCE+2
MOV AX,0
MOV AL,[SENTENCE+1] ;句子字符个数
MOV AH,[KEYWORD+1] ;关键词字符个数
CMP AL,AH
JL NO
SUB AL,AH
MOV AH,0
MOV CX,AX
INC CX

COMPARE:
PUSH CX
MOV CX,3 ;建议采用mov ax,字符个数,使字符的个数不固定
CLD
REPZ CMPSB
JZ MATCH
MOV AX,3 ;建议采用mov ax,字符个数
SUB AX,CX
SUB SI,AX ;关键词回到词首
MOV AX,2 ;建议采用mov ax,字符个数-1
SUB AX,CX
SUB DI,AX

POP CX
LOOP COMPARE
NO: LEA DX,STRING4
MOV AH,09H
INT 21H
JMP EXIT
MATCH: POP CX
MOV BX,DI

LEA DX,STRING3
MOV AH,09H
INT 21H
SUB BX,OFFSET SENTENCE+2
SUB BX,2 ;首地址所在字符串中的地址
CALL CHANGE
LEA DX,STRING5
MOV AH,09H
INT 21H
EXIT:
RET
MAIN ENDP


CHANGE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CH,4
MOV CL,4
ROTATE: ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRINTIT
ADD AL,7H
PRINTIT:
MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ ROTATE
POP DX
POP CX
POP BX
POP AX
RET
CHANGE ENDP
CODE ENDS
END START
我帮你修改了一下,主要是里面的堆栈操作出了问题,导致你的程序无法正常返回。
还有就是那字符串的指针计算也有些问题吧!

2006-11-15 17:14
ljf253020645
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-11-15
收藏
得分:0 

恩就是堆栈问题

2006-11-16 21:36
我叫包包
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-12-26
收藏
得分:0 
为什么我在运行时 总说start没定义呢
2011-12-26 17:22
快速回复:查找匹配字符串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016111 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved