|
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
;****************************************************

|