0
回答
【汇编语言】76行起,为什么DI,SI要再清零?CX要先出栈再进栈?
极速云服务器,低至1.04元/天>>>   
DATA SEGMENT
TIP1 DB'please enter keyword:','$'
TIP2 DB'please enter sentence:','$'
TIP3 DB'Match at location:','$'
TIP4 DB'NOT MATCH',13,10,'$'
TIP5 DB'MATCH',13,10,'$'
WRAP DB 13,10,'$';设置提示信息
BUFF1 LABEL BYTE
MAX1 DB 10
ACT1 DB ?
BUF1 DB 10 DUP(?)
BUFF2 LABEL BYTE
MAX2 DB 50
ACT2 DB ?
BUF2 DB 50 DUP(?)
DATA ENDS

STACK SEGMENT
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
 PUSH DS
 SUB AX,AX
 SUB BX,BX
 SUB DI,DI
 SUB SI,SI
 PUSH AX;将AX,BX,DI,SI清零
 MOV AX,DATA
 MOV DS,AX
 LEA DX,TIP1
 MOV AH,09
 INT 21H;显示第一条提示信息
 LEA DX,BUFF1
 MOV AH,0AH
 INT 21H;输入关键字
 CMP ACT1,0
 JE JMPLUS;输入的关键字为空,退出程序
SHOW1:
 LEA DX,WRAP
 MOV AH,09
 INT 21H;换行
 LEA DX,TIP2
 MOV AH,09
 INT 21H;显示第二条提示信息
 LEA DX,BUFF2
 MOV AH,0AH
 INT 21H;输入被查找的句子
 MOV AL,ACT1
 CBW
 MOV CX,AX;保存关键字长度到CX
 PUSH CX;CX入栈
 MOV AL,ACT2
 CMP AL,0
 JE SHOW5;输入的句子为空,NO Match
 SUB AL,ACT1
 JS SHOW5;被查找句子长度小于关键字长度,NO Match
 INC AL;设置在被查找句子中的循环次数,该次数为AL-ACT1+1
 CBW
 LEA BX,BUF2;将被查找句子首地址放入BX
 MOV DI,0
 MOV SI,0
SHOW2:
 MOV AH,[BX+DI]
 CMP AH,BUF1[SI]
 JNE SHOW3;比较,如字符不相等就跳转到show3
 INC DI
 INC SI
 DEC CX;遇到一个相等字符,CX减一
 CMP CX,0
 JE SHOW4;CX为0,比较完毕,跳转到show4
 JMP SHOW2
JMPLUS:
 JMP EXIT;show1中直接跳转至exit,会超出跳转范围,设置过渡。
SHOW3:
 INC BX
 DEC AL
 CMP AL,0
 JE SHOW5
 MOV DI,0
 MOV SI,0
 POP CX
 PUSH CX
 JMP SHOW2;将要查找句子的下一个字符和关键字第一个字符比较,如果al等于0,则说明NO Match!
SHOW4:
 SUB BX,OFFSET BUF2
 INC BX;将BX减去被查找句子的首地址,加1得到关键字所在位置。
 LEA DX,WRAP
 MOV AH,09
 INT 21H;换行
 LEA DX,TIP5
 MOV AH,09;显示提示语句5
 INT 21H
 LEA DX,TIP3
 MOV AH,09
 INT 21H;显示提示语句3
 CALL TRANS;调用TRANS子函数转换为16进制
 JMP EXIT;结束程序
TRANS PROC NEAR
       MOV CH,4
ROTATE:MOV CL,4
       ROL BX,CL;将BX循环左移4位
       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
       RET
TRANS ENDP
SHOW5:
       LEA DX,WRAP
       MOV AH,09
       INT 21H
       LEA DX,TIP4
       MOV AH,09
       INT 21H
       JMP SHOW1;如果不匹配不结束程序,继续show1
EXIT:  
       MOV AH,4CH
       INT 21H;匹配后释放程序
     
CODE ENDS
     END START
举报
MagicBLS
发帖于3年前 0回/501阅
顶部