一、数据段
1.字符串结尾:13,10,'$'
2.设置格式控制字符串(这样就不用再写clrf函数了)
3.设置存关键字和句子的地址标签,以关键字为例
二、代码段
1.输入字符串
2.字符串比较
2.1 每次的比较长度,KLEN->CL
2.2 设置目标串起始位置
2.3 比较
2.4 偏移地址++,并与目标串长度比较,判断是否出界
3. 二进制转16进制
三、完整代码及注释
一、数据段
1.字符串结尾:13,10,'$'
2.设置格式控制字符串(这样就不用再写clrf函数了)
FORMAT DB 13,10,'$' ;格式
3.设置存关键字和句子的地址标签,以关键字为例
- max1——最大长度限制
- KLEN——字符串的实际长度
- keywd——输入的内容
KEYWORD Label byte ;存关键字max1 DB 10KLEN DB ?keywd DB 10 dup(?)
二、代码段
1.输入字符串
- 将关键字缓冲区的地址加载到 DX 寄存器
- 将中断 21H 的功能号设置为 0AH(缓冲输入)
- 调用中断 21H 来执行缓冲输入操作
LEA DX, KEYWORD ;输入keywordMOV AH, 0AH INT 21H
2.字符串比较
2.1 每次的比较长度,KLEN->CL
MOV CL, KLEN ;cl存keyword的长度
2.2 设置目标串起始位置
LEA BX, sentc ;BX存sentence的基址ADD BL, AL ;al是偏移地址MOV DI, BX ;DI通常用来存目标字符串的地址
2.3 比较
- REPE CMPSB —— 以字节为单位进行比较
- ZF = 0——匹配
REPE CMPSB ;以字节为单位进行比较,直到cx=0或不相等退出JZ MATCH ;CMP是两数相减进行比较,jz=0表示相等
2.4 偏移地址++,并与目标串长度比较,判断是否出界
INC ALCMP AL, SLENJAE NOT_MATCH
3. 二进制转16进制
BTOH PROC FARMOV CH, 4 ; 16/4, 处理四次ROTATE:MOV CL, 4 ; 一次处理四位ROL BX, CL ; 循环左移四位,从最高四位开始处理(移到最低四位)MOV AL, BL ; 取低8位AND AL, 0fh ; 取低4位ADD AL, 30h ; 转为数字字符CMP AL, 3AH ; 9后面的数JB printADD AL, 7h ; 转为字母print:MOV DL, ALMOV AH, 02INT 21HDEC CH JNZ ROTATE RET
BTOH endp
三、完整代码及注释
DATAS SEGMENTSTRING1 DB 'Enter keyword:$'STRING2 DB 'Enter sentence:$'STRING3 DB 'Match at location:$'STRING4 DB 'H of the sentence.',13,10,'$' ;句号结尾,换行回车 STRING5 DB 'No match.',13,10,'$'FORMAT DB 13,10,'$' ;格式KEYWORD Label byte ;存关键字max1 DB 10KLEN DB ?keywd DB 10 dup(?)SENTENCE Label byte ;存句子max2 DB 50SLEN DB ?sentc DB 50 dup(?)DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATAS,SS:STACKSmain PROC farSTART:PUSH DSXOR AX, AXPUSH AXMOV AX, DATASMOV DS, AXMOV ES, AXLEA DX, STRING1MOV AH, 09INT 21HLEA DX, KEYWORD ;输入keywordMOV AH, 0AH INT 21HLEA DX, FORMAT ;格式控制MOV AH, 09INT 21HINPUTSENTC:LEA DX, STRING2MOV AH, 09INT 21HLEA DX, SENTENCE ;输入sentenceMOV AH, 0AHINT 21hLEA DX, FORMAT ;格式控制MOV AH, 09INT 21HMOV AX, 0 ;清空AXLOOP_CMP:MOV CL, KLEN ;cl存keyword的长度LEA SI, keywd ;SI通常用来存源字符串的地址LEA BX, sentc ;BX存sentence的基址ADD BL, AL ;al是偏移地址MOV DI, BX ;DI通常用来存目标字符串的地址REPE CMPSB ;以字节为单位进行比较,直到cx=0或不相等退出JZ MATCH ;CMP是两数相减进行比较,jz=0表示相等INC AL ;偏移量++CMP AL, SLEN ;判断是否到sentence末尾JAE NOT_MATCH ;NOT MATCHJMP LOOP_CMP ;继续比较MATCH:MOV BX, 0 ;为什么给bx,不直接用ax?1)MOV BL, AL ;BL中存偏移量ADD BX, 1 ;从下标为1开始LEA DX, STRING3 MOV AH, 09 ;1) AX用处比较多INT 21H CALL BTOH ;二进制转十六进制子程序LEA DX, STRING4MOV AH, 09INT 21HJMP INPUTSENTC ;BTOH PROC FARMOV CH, 4 ; 16/4, 处理四次ROTATE:MOV CL, 4 ; 一次处理四位ROL BX, CL ; 循环左移四位,从最高四位开始处理(移到最低四位)MOV AL, BL ; 取低8位AND AL, 0fh ; 取低4位ADD AL, 30h ; 转为数字字符CMP AL, 3AH ; 9后面的数JB printADD AL, 7h ; 转为字母print:MOV DL, ALMOV AH, 02INT 21HDEC CH JNZ ROTATE RET
BTOH endpNOT_MATCH:LEA DX, STRING5MOV AH, 09INT 21HJMP INPUTSENTCEXIT:RET
main endp
CODES ENDS
END START