|
datarea segment
keyword db 5,?,5 dup(?)
sentence db 50,?,50 dup(?)
accesstalk1 db 'Enter keyword:','$'
accesstalk2 db 13,10,'Enter Sentence:','$'
answer1 db 13,10,'Match At location:','$'
answer3 db 'H of the sentence.','$'
answer4 db 13,10,'No Macthed!','$'
datarea ends
;****************************************************
codearea segment
assume cs:codearea , ds:datarea , es:datarea
main proc far

push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
mov es,ax
;
lea dx,accesstalk1
mov ah,09h
int 21h
;
lea dx,keyword
mov ah, 0ah
int 21h
;
start:
lea dx,accesstalk2
mov ah, 09h
int 21h
;
lea dx ,sentence
mov ah, 0ah
int 21h
;
lea si ,sentence+2;这里是被比较的句子的起始位置,之所以要+2,是因为存放句子的空间中第一位存放的是句子可输入的最大长度, ;第二位存放的是有效实际长度,从sentence+2开始才是实际的要比较的字符串
mov dl, sentence+1;注意了,这里sentence+1中的内容是字节类型的,DL是字节类型的,DX是字类型的,因为类型要匹配,所以DL
mov dh, 0
mov cl, keyword+1;这里面存放的是关键字的有效长度
mov ch,0
sub dx,cx;见实验指导书中最多需要比较的次数
inc dx
lea bx,sentence+2;bx里面放的是被比较句子的开始位置
;
next:
mov si ,bx;从这里开始循环比较,每次回过来的时候都要把si的值变成新的下一个字符的位置,见下面的BX,每次循环都要被加一
lea di ,keyword+2
mov cl ,keyword+1
mov ch ,0
cld
repz cmpsb;循环比较字符串是否匹配
jz compare;当找到相同的字符串的时候时跳到compare里面
dec dx;循环次数减一
jz allover;当循环次数被减到等于零的时候呢,就要跳到allover里面去了,就是找遍了整个句子还是没有找到匹配的,跳转
inc bx ;这边就是对BX加一,使得地址不断的往前移动
jmp next;这边是循环的实现,跳到上面的next
;
compare:
lea dx,answer1
mov ah,09h
int 21h
;
lea si ,sentence+2
sub bx,si
inc bx;这里的bx等于bx比较完的时候的值,也就是地址,减去sentence+2的标注的地址,得到的数值加上1就是第一个匹配位置
call change;调用子函数,十进制到十六进制的转化
lea dx,answer3
mov ah,09h
int 21h
jmp start
;
allover:
lea dx ,answer4;小心使用的寄存器必须是DX,此次实验失败的原因是这里使用SI寄存器了!FUCK
mov ah ,09h
int 21h
jmp start
ret
main endp
change proc near
push ax
push bx
push cx
push dx
mov ch,4
rotate:
mov cl,4
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl print
add al,7h
print:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
pop dx
pop cx
pop bx
pop ax
ret
change endp
codearea ends
end main
;****************************************************

|