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