编写一个汇编程序,关于统计字符串中某个字符串的个数!我是新手,望高手们帮帮忙!
内存中以TAB单元开始的区域连续存放着一个ASCLL字符串,编写程序统计其中包括多少个字符串“LQ”,将统计的个数以十进制形式输出在屏幕上...
内存中以TAB单元开始的区域连续存放着一个ASCLL字符串,编写程序统计其中包括多少个字符串“LQ”,将统计的个数以十进制形式输出在屏幕上
展开
1个回答
展开全部
DATA SEGMENT
;假原定字符串
TAB DB 'LQONE LQLQLQLQ TWO LQL1L2LQQLQ THERE QLLQLQQLQ!'中尘数,'$' LEN EQU $-TAB ;求字符串长度
DES DB 'LQ' ;要查找和统计的字符串
LEN1 EQU $-DES ;要查找的字符串长度
COUNT DW 0 ;用来统计字符串的个数
OUTPUT DB 5 DUP(20H),'$' ;用来控制显示输出
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AH,09H ;显示原字符串
LEA DX,TAB
INT 21H
MOV BX,LEN ;原串长度送BX,用来控制是否找完
LEA SI,TAB
S0: MOV CX,LEN1 ;要查找的字符串长度送CX
LEA DI,DES
CLD
REPZ CMPSB ;看是否找到
JNZ NEXT ;如果没找到,则比较提前退出,所以接着从下一个字符重新找
INC COUNT ;找到,则统计加1
SUB BX,LEN1 ;找到,则用原串直接减去目的串的长度后再找
JMP LP0
NEXT: SUB CX,LEN1
INC CX
ADD BX,CX ;没找到,则减去已比较的字符数
LP0: CMP BX,LEN1 ;看BX值是否小于目的串的长度,是则找完,否则继续找
JB FINISH
JMP S0
FINISH: MOV BX,COUNT
LEA SI,OUTPUT+4
CALL HEXTOD ;把结果转换成十进制的ASCII码,并按倒续送到SI开始卖首指到的单元
CALL CRLF ;回车换行
MOV AH,09H ;输出转换后的结果,也就是统计的结果
LEA DX,OUTPUT
INT 21H
MOV AH,4CH ;返回DOS
INT 21H
CRLF:
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
RET
;----------------------------
;BX为入口参数,代表要转换的数
;SI为入口参数,代表转换结果的位置(倒续)
;转换后的结果在SI开始的位置
;--兄余--------------------------
HEXTOD:
MOV AX,BX
MOV BX,10
S1: MOV DX,0
DIV BX
CMP AX,0
JZ RETE
ADD DL,30H
MOV [SI],DL
DEC SI
JMP S1
RETE: ADD DL,30H
MOV [SI],DL
RET
CODE ENDS
END START
;假原定字符串
TAB DB 'LQONE LQLQLQLQ TWO LQL1L2LQQLQ THERE QLLQLQQLQ!'中尘数,'$' LEN EQU $-TAB ;求字符串长度
DES DB 'LQ' ;要查找和统计的字符串
LEN1 EQU $-DES ;要查找的字符串长度
COUNT DW 0 ;用来统计字符串的个数
OUTPUT DB 5 DUP(20H),'$' ;用来控制显示输出
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AH,09H ;显示原字符串
LEA DX,TAB
INT 21H
MOV BX,LEN ;原串长度送BX,用来控制是否找完
LEA SI,TAB
S0: MOV CX,LEN1 ;要查找的字符串长度送CX
LEA DI,DES
CLD
REPZ CMPSB ;看是否找到
JNZ NEXT ;如果没找到,则比较提前退出,所以接着从下一个字符重新找
INC COUNT ;找到,则统计加1
SUB BX,LEN1 ;找到,则用原串直接减去目的串的长度后再找
JMP LP0
NEXT: SUB CX,LEN1
INC CX
ADD BX,CX ;没找到,则减去已比较的字符数
LP0: CMP BX,LEN1 ;看BX值是否小于目的串的长度,是则找完,否则继续找
JB FINISH
JMP S0
FINISH: MOV BX,COUNT
LEA SI,OUTPUT+4
CALL HEXTOD ;把结果转换成十进制的ASCII码,并按倒续送到SI开始卖首指到的单元
CALL CRLF ;回车换行
MOV AH,09H ;输出转换后的结果,也就是统计的结果
LEA DX,OUTPUT
INT 21H
MOV AH,4CH ;返回DOS
INT 21H
CRLF:
MOV AH,02H
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
RET
;----------------------------
;BX为入口参数,代表要转换的数
;SI为入口参数,代表转换结果的位置(倒续)
;转换后的结果在SI开始的位置
;--兄余--------------------------
HEXTOD:
MOV AX,BX
MOV BX,10
S1: MOV DX,0
DIV BX
CMP AX,0
JZ RETE
ADD DL,30H
MOV [SI],DL
DEC SI
JMP S1
RETE: ADD DL,30H
MOV [SI],DL
RET
CODE ENDS
END START
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询