文档库

最新最全的文档下载
当前位置:文档库 > 汇编实验 查找匹配字符串

汇编实验 查找匹配字符串

实验二查找匹配字符串

一、实验的目的与要求

(一)实验目的:练习字符串的匹配程序设计。

(二)实验要求:程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

二、实验正文

实验分析:字符串的匹配进行应选用repz cmpsb操作,匹配一次过程后去判断关键字的指针移动的步数是不是和关键字长度相同,如果相同说明匹配成功,调用进制转化函数将结果输出即可,如果句子的指针移动到最后也没有使关键字的指针移动到它的结尾说明不能匹配输出no match!。存储字符串的采用两个变量置最大长度分别为20,50,以存储输入的数据,便于进行下一步的匹配操作。读入字符串要用到0ah调用。

三、流程图如下:

汇编实验 查找匹配字符串

汇编实验 查找匹配字符串

四、实验结果

汇编实验 查找匹配字符串

汇编实验 查找匹配字符串

附录:程序源代码如下:

;******************************************************** datarea segment

keyadr label byte

keymax db 20

keyact db ?

keystring db 20 dup(?)

senadr label byte

senmax db 50

senact db ?

secstring db 50 dup(?)

messkey db 'Enter keyword:','$'

messsen db 0dh,0ah,'Enter Sentence:','$'

nomatch db 0dh,0ah,'No match.','$'

match db 0dh,0ah,'Match at location:','$'

rest db 'H of the sentence.','$'

datarea ends

;******************************************************** prognam segment

;--------------------------------------------------------

main proc far

assume cs:prognam,ds:datarea,es:datarea

start:

push ds

xor ax,ax

push ax

mov ax,datarea

mov ds,ax

mov es,ax

lea dx,messkey;

mov ah,09h

int 21h

lea dx,keyadr

mov ah,0ah

int 21h

lea dx,messsen

mov ah,09h

int 21h

lea dx,senadr

mov ah,0ah

int 21h

mov al,senact

sub al,keyact

jl nmatch

call search

jmp short e0

nmatch:

lea dx,nomatch

mov ah,09h

int 21h

e0:

ret

main endp

;------------------------------------------------------- search proc near

xor cx,cx;markoff counter

mov dx,offset senadr

add dl,senact

inc dl

mov cl,keyact

cld

lea di,secstring

r0:

lea si,keystring

repz cmpsb

mov al,byte ptr [si-1]

cmp al,byte ptr [di-1]

jnz next

sub si,offset keystring

mov ax,si

cmp al,keyact

je showp

next:

mov cl,keyact

cmp di,dx

jnz r0

shown:

lea dx,nomatch

mov ah,09h

int 21h

jmp short e1

showp:

lea dx,match

mov ah,09h

int 21h

dec di

mov bx,di

xor ax,ax

mov al,keyact

sub bx,ax

mov ax,offset senadr

sub bx,ax

call binihex

lea dx,rest

mov ah,09h

int 21h

e1:

ret

search endp

binihex proc near

mov ch,4

r1:

mov cl,4

rol bx,cl

mov dl,bl

and dl,0fh

add dl,30h

cmp dl,39h

jle disp

add dl,07h

disp:

mov ah,02h

int 21h

dec ch

jnz r1

ret

binihex endp

;-------------------------------------------------------

prognam ends

;******************************************************** end main

三、实验总结

与第一次实验相比这次用到了数据段,应该注意数据段的定义和使用。此外应该注意单个字符时的“边缘”情况因为,这是指针的移动和关键字的长度是一致的,但是这并不意味着,两个字符串匹配。输出结果采用十六进制输出在《IBM PC汇编语言程序设计》一书中例6.3decihex中的子过程binihex,这里也提醒我要注意积累一些知识,只有这样才能把汇编语言学好。