汇编实验 查找匹配的字符串

;PROGRAM TITLE GOES HERE–search
;*******************************
datarea segment
mess1 db ‘Enter keyword:’,’ ′ m e s s 2 d b ′ E n t e r S e n t e n c e : ′ , ′ ' mess2 db 'Enter Sentence:',' mess2dbEnterSentence:,
mess3 db ‘Match at location:’,’ ′ m e s s 4 d b ′ N o m a t c h ! ′ , 13 , 10 , ′ ' mess4 db 'No match!',13,10,' mess4dbNomatch!,13,10,
mess5 db ‘match.’,13,10,’$ ’
mess6 db ‘H of the sentence.’,13,10,’$ ’
;
stoknin1 label byte
max1 db 10
act1 db ?
stokn1 db 10 dup(?)
;
stoknin2 label byte
max2 db 50
act2 db ?
stokn2 db 50 dup(?)
datarea ends
;*********************************
prognam segment
;---------------------------------
main proc far
assume cs:prognam ,ds:datarea,es:datarea
start::
push ds
sub ax,ax
sub bx,bx
push ax
mov ax,datarea
mov ds,ax
mov es,ax
;MAIN PART-------------
lea dx,mess1 ;输入关键字
mov ah,09
int 21h
lea dx,stoknin1
mov ah,0ah
int 21h
cmp act1,0
je exit
a10: ;输入句子
call crlf
lea dx,mess2
mov ah,09
int 21h
lea dx,stoknin2
mov ah,0ah
int 21h
cmp act2,0
je nmatch
mov al,act1
cbw
mov cx,ax
push cx
mov al,act2
sub al,act1
js nmatch
mov di,0
mov si,0
lea bx,stokn2;
inc al
a20:
mov ah,[bx+di] ;开始比较
cmp ah,stokn1[si] ;不等则转到bx+1
jne a30 ;bx+1
inc si
inc di
;inc bx
dec cx
cmp cx,0
je match
jmp a20
a30:
inc bx
dec al
cmp al,0
je nmatch
mov si,0
mov di,0
pop cx
push cx
jmp a20
exit:
call crlf
ret
nmatch: ;no match则输出No match
call crlf
lea dx,mess4
mov ah,09
int 21h
jmp a10
match: ;match则输出位置信息
call crlf
lea dx,mess3
mov ah,09
int 21h
sub bx,offset stokn2
inc bx
call trans
lea dx,mess6
mov ah,09
int 21h
jmp a10
crlf proc near ;回车,换行
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
trans proc near ;转换为16进制,参考书上例6.3
mov ch,4 ;number of digits
rotate: mov cl,4 ;set count to 4bits
rol bx,cl ;left digit to right
mov al,bl ;mov to al
and al,0fh ;mask off left digit
add al,30h ;convert hex to ASCII
cmp al,3ah ;is it>9?
jl printit ;jump if digit=0 to 9
add al,7h ;digit is A to F
printit:
mov dl,al ;put ASCII char in DL
mov ah,2 ;Display Output funct
int 21h ;call DOS
dec ch ;done 4 digits?
jnz rotate ;not yet
ret ;return from trans
trans endp ;
main endp
;----------------------------------
prognam ends
;**********************************
end start

程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示’no match’;如果句子中包含关键字则显示‘match’,且把该字在句子中的位置用十六进制数显示出来,要求程序的执行过程如下: enter keyword :abc enter sentence :we are studying abc match at location :11H of the sentence enter sentence: xyz ,ok? no match enter sentence :^c 四. 方法说明: 程序可由三部分组成: (1 ) 输入关键字和一个句子,分别存入相应的缓冲区中,可用功能调用0AH。 (2) 在句子中查找关键字。 1. 关键字和一个句子中相应字段的比较可使用串比较指令,为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,这样,相应的寄存器内容也有了确定的含义,如下: SI 寄存器为关键字的指针 DI 寄存器为句子中正相比较的字段的指针 CX寄存器存放关键字的字母个数(长度) 2. 整个句子和关键字的比较过程可以用一个循环结构来完成。循环次数为: (句子长度--关键字长度)+1在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“no match”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。 (3) 输出信息: 用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。在“找到”时,还要求显示出匹配字符串在句子中的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1 即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制数从屏幕上显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值