汇编语言中 字符串匹配怎么让相同的字符显示出来并显示个数
*********************************************************************************
程序将输出从键盘输入的字符,并显示出相同的字符及相同字符的个数。
*********************************************************************************
注x8086的数组起始0还是1,我记不清了,我是按0算的,根据你的情况看嘛......
DATA SEGMENT数据段开始
BUFFER DB 100定义BUFFER数据第1个数据DB类型,且值为100
DB ?定义1空的DB类型。
DB 100 DUP(?)定义100个DB类型的数据,初始化
CHARS DB 'INPUT:$'定义字符串"INPUT:"以$为结束标识
DATA ENDS数据段结束
CODE SEGMENT代码段
ASSUME CS:CODE,DS:DATA段代码声明CS
MAIN PROC FAR定义"MAIN"函数
***************************************************
PUSH DS将数据段地址堆栈
SUB AX,AX清零AX,AX=0
PUSH AX将AX入栈,实际将压入0堆栈中
MOV AX,DATA把数据段起始地址放入AX中
MOV DS,AX初始化DS(数据段地址)
********以上是固定的,又叫程序的初始化数据段*******
START: MOV DX,OFFSET CHARS取CHARS的字符首地址放入DX中
MOV AH,9将9号DOS中断功能号,放入AH中,用于显示DX所存的字符串
INT 21H调用21号中断
********以上用于显示"INPUT:"字符串**********
MOV DX,OFFSET BUFFER 取CHARS的字符首地址放入DX中
MOV AH,0AH将0A号DOS中断功能号,用于从键盘缓冲输入,并保存DX所存的地址中
INT 21H调用21号中断
********以上用于从键盘缓冲中输入到BUFFER中,输入的东西将放入BUFFER中*************
MOV DL,0AH把“换行符”放入DL中
MOV AH,202号功能,将从DL中输出一个字符
INT 21H调用21号中断
*******以上用于换行1,输出换行符**********
MOV DL,0DH把“回车符”放入DL中
MOV AH,202号功能,将从DL中输出一个字符
INT 21H调用21号中断
*******以上用于换行2,输出回车符**********
*******上两用于换行*******
MOV SI,OFFSET BUFFER把从键盘输入的字符,BUFFER地址给SI
INC SI指向第二个字符
MOV AL,[SI]放入AL
INC SI指向下一个字符
MOV DL,[SI]SI指向的下一个字符给DL
MOV DH,[SI]同时给DH
MOV DI,SIDI指向BUFFER的第三个字符
MOV CL,ALCL=AL=BUFFER[1]=100
MOV CH,0CH=0
MOV BL,1BL=1
MOV BH,0BH=0
DEC CLCL减1
GO1: INC SISI指向下一个字符
CMP DL,[SI]比较BUFFER[i]与BUFFER[i+]是否相等
JNE TO1不相等转到TO1
INC BL如果相等BL将加1
TO1: LOOP GO1循环CX-1,转到GO1
************以上函数遍历BUFFER中所有字符,并将与BUFFER[1]相同的字符的个数放入BL中,**************
CALL OUTPUT调用OUTPUT,输出我们能看懂的十位数,显示出来
MOV BL,1BL=1
TO5: INC DIDI+1,批向下一个地址,DI指向BUFFER第四个字符了
DEC ALAL减1,第一次是AL=99
CMP AL,1和1比较
JE TO3如果是1转到TO3
CMP DH,[DI]和DH字符比较,BUFFER[1]是否相等
JE TO5如果相等就回到TO5
MOV DL,[DI]如果不相等的话,将DI指向的字符放入DL中,
MOV SI,DISI=DI放入SI
MOV CL,ALCL=AL
MOV CH,0CH=0,CX=CL
DEC CLCL=CL-1
GO2: INC SI指向下一个字符
CMP [SI],DL和DL字符比较,BUFFER[1]是否相等
JNE TO2如果相等就回到TO2
INC BL相同时BL=BL+1
MOV [SI],DH将相同的字符放入SI中
TO2: LOOP GO2CL=CL-1
CALL OUTPUT显示相同的字符个数
MOV BL,1BL重新计算,初始化为,因为本身就是一个字符,如果有一个相同就应该有2个相同字符了
JMP TO5跳到TO5
TO3: CMP DH,[DI]当AL=1,循环结束以后,将跳到这里来
JE TO4如果DH这时与DI里地址里所放的值相同,那么就结束。
MOV DL,[DI]否则[DI]放入DL中
MOV BL,1给BL为1,因为这时,就只有一个字符了,没有与他相同的字符了。
CALL OUTPUT把字符个数输出.
TO4: RET
MAIN ENDP
;--------------------------
OUTPUT PROC 自定义函数
PUSH AX//
PUSH CX//
PUSHF//保存现场
MOV AH,2调用DOS功能号02,将DL中的内容输出,即BUFFER[1]输出
INT 21H调用INT 21中断
MOV DL,20H“空格”的ASCII码
MOV AH,2调用DOS功能号02,将DL中的“空格”输出
INT 21H
MOV AL,BLAL=BL,相同字符次数
MOV AH,0AX=AL
MOV CL,10CL=10
DIV CLAX=AX/CL=AL/10=BL/10,AL中为商,AH中为余数
ADD AH,30HAH=AH+30,将数字转换成对应ASCII
ADD AL,30HAL=AL+30,将商转换成对应的ASCII码
MOV CH,AHCH放入余数的ASCII码
******************以上是将BL转换成十进制数***********
MOV DL,ALDL放入商的ASCII码
MOV AH,2调用DOS功能号02,将DL中的AL商值输出,,,实际是重复次数的十位数
INT 21H
*****输出十位数****
MOV DL,CH
MOV AH,2
INT 21H
******输出个位数****
MOV DL,0AH
MOV AH,2
INT 21H
*******以上用于换行1,输出换行符**********
MOV DL,0DH
MOV AH,2
INT 21H
*******以上用于回车2,输出回车符**********
POPF //恢复现场
POP CX //
POP AX//恢复现场
RET//返回
OUTPUT ENDP
CODE ENDS
END MAIN
CODE SEGMENT ASSUME CS:CODE ORG 100H START: JMP BB INSTR0 DB 256 DUP(' ') DB 10,13,'$' INNUM DW 0 LETSTR DB 10,13,'Letter:' LETTER DB 256 DUP(' ') LETTERNUM DW 0 NUMSTR DB 10,13,'Number:' NUMBER DB 256 DUP(' ') NUMBERNUM DW 0 OTHSTR DB 10,13,'Othser:' OTHER DB 256 DUP(' ') OTHERNUM DW 0 LFCR DB 10,13,'$' BB: PUSH CS POP ES PUSH CS POP DS LEA DI,INSTR0 BB1: MOV AH,1 INT 21H CMP AL,13 JE NEXT1 MOV [DI],AL INC WORD PTR[INNUM] INC DI JMP BB1 NEXT1: LEA SI,INSTR0 MOV CX,INNUM LP: CMP BYTE PTR[SI],'0' JL N2 CMP BYTE PTR[SI],'9' JG N2 MOV AL,[SI] MOV DI,NUMBERNUM MOV BYTE PTR NUMBER[DI],AL INC WORD PTR[NUMBERNUM] JMP N5 N2: CMP BYTE PTR[SI],'a' JL N3 CMP BYTE PTR[SI],'z' JG N3 MOV AL,[SI] MOV DI,LETTERNUM MOV BYTE PTR LETTER[DI],AL INC WORD PTR[LETTERNUM] JMP N5 N3: CMP BYTE PTR[SI],'A' JL N4 CMP BYTE PTR[SI],'Z' JG N4 MOV AL,[SI] MOV DI,LETTERNUM MOV BYTE PTR LETTER[DI],AL INC WORD PTR[LETTERNUM] JMP N5 N4: MOV AL,[SI] MOV DI,OTHERNUM MOV BYTE PTR OTHER[DI],AL INC WORD PTR[OTHERNUM] N5: INC SI LOOP LP MOV DI,LETTERNUM MOV BYTE PTR LETTER[DI+1],'$' MOV DI,NUMBERNUM MOV BYTE PTR NUMBER[DI+1],'$' MOV DI,OTHERNUM MOV BYTE PTR OTHER[DI+1],'$' MOV AH,9 LEA DX,LETSTR INT 21H MOV AH,9 LEA DX,NUMSTR INT 21H MOV AH,9 LEA DX,OTHSTR INT 21H LEA DX,LFCR MOV AH,9 INT 21H MOV AX,[INNUM] CALL DISPAX MOV AH,4CH INT 21H;=============================================== ; 将要显示的无符号数置于 ax 中 DISPAX PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP PUSHF PUSH DS PUSH CS POP DS MOV BYTE PTR NZ,0 PUSH AX LEA SI,DIVARR MOV CX,5 @1: POP AX MOV DX,0 MOV BX,[SI] DIV BX PUSH DX CMP AL,0 JNE @2 CMP BYTE PTR NZ,1 JE @2 CMP CX,1 JE @2 MOV DL,20H JMP @3 @2: ADD AL,30H MOV DL,AL MOV BYTE PTR NZ,1 @3: MOV AH,2 INT 21H INC SI INC SI LOOP @1 POP DX POP DS POPF POP BP POP DI POP SI POP DX POP CX POP BX POP AX RET DIVARR DW 10000,1000,100,10,1 NZ DB 0 DISPAX ENDP;------------------------------------------ CODE ENDS END START
// 假设字符串地址1: 0x1800// 假设字符串地址2: 0x1900
// 假设字符串数量为80
// 示例程序如下:
CompareChar
MOV.W #0x1800 ,R10
MOV.W #0x1900 ,R11
MOV.W #80 ,R12
MOV.W #80 ,R13
CompLP1 CMP.B (0)R10 ,0(R11)
JEQ CompLP2
DEC.W R13
CompLP2 INC.W R10
INC.W R11
DEC.W R12
JNZ CompLP1
RET
调用这个子程序,R13的值就是字符串中相同字符的个数。
大狐兴佰乐: // 假设字符串地址1: 0x1800// 假设字符串地址2: 0x1900// 假设字符串数量为80// 示例程序如下:CompareChar MOV.W #0x1800 ,R10 MOV.W #0x1900 ,R11 MOV.W #80 ,R12 MOV.W #80 ,R13 CompLP1 CMP.B (0)R10 ,0(R11) JEQ CompLP2 DEC.W R13 CompLP2 INC.W R10 INC.W R11 DEC.W R12 JNZ CompLP1 RET 调用这个子程序,R13的值就是字符串中相同字符的个数.
甘孜县17328871875: 汇编语言编写程序,比较两个字符串所含字符是否相等,如果相等,AX存入1,反之存入0 - ?
大狐兴佰乐: data segment stringa db 'abcdefg' stringb db 'abcdefg' data ends;定义字符串A,B用于比较 stack segment dw 20 dup(0) stack ends;设置一个堆栈(可不要) code segment assume cs:code,ds:data,ss:stack start:mov ax,data mov ds,ax mov cx,7...
甘孜县17328871875: 汇编:试编写一个程序,比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示“match”若不 - ?
大狐兴佰乐: A4001:extra characters on line程序有多余字符的意思 下面应该会告诉你哪多了
甘孜县17328871875: 试编写一个程序,比较两个同长字符串STRING1和STRING2所含字符是否完全相同,若相同MATCH单元赋值1 - ?
大狐兴佰乐: 假设字符串存放地址S1与S2mov r0, s1 mov r1, s2 mov r2, Len compare: mov a, @r0 cmp a, @r1 jnz NoEqual inc r0 inc r1 djnz compare mov match, 1 ajmp quit NoEqual: mov match, 0 quit: ret
甘孜县17328871875: 汇编语言字符串匹配程序在原基础上如何修改? - ?
大狐兴佰乐: 问题,表达的很含糊.在基本实验基础上,统计显示出第1个相同字符的字符形式和数量,不超过10个即可.--什么是字符形式呀?--可以统计出:--字符串1中第1个字符,在字符串2中数量,以及第一次出现的位置.在基本实验基础上,统计显示出所有相同字符的字符形式和数量,不超过10个即可.--看不懂说些什么.
甘孜县17328871875: 汇编语言:比较两个输入的字符串是否完全相同,是则显示YES,否则显示NO. - ?
大狐兴佰乐: DATA SEGMENT STR1 DB 100 LEN1 DB ? DB 100 DUP(?) STR2 DB 100 LEN2 DB ? DB 100 DUP(?) INFO1 DB 0AH,0DH,'input string1:','$' INFO2 DB 0AH,0DH,'input string2:','$' INFO3 DB 0AH,0DH,'string1=string2:' JUDG DB 20H,20H,20H,'...
甘孜县17328871875: 编写程序,实现两个字符串的比较.如字符长度相同并且对应字符顺序相同,则显示“MATCH”,否则,显示“NO MATCH”. - ?
大狐兴佰乐: 用哪种语言呀? Perl sub perl_match{($match_i,$match_j)=@_;if($match_i eq $match_j){return "MATCH";}else{return "NO MATCH";} } JAVA public String javaMatch(String matchI,String matchJ){if(matchI.equals(matchJ)){return "...
甘孜县17328871875: 如何用正则匹配连续重复的字符串片段 - ?
大狐兴佰乐: + 匹配前面的子表达式一次或多次.例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z".+ 等价于 {1,}. * 匹配前面的子表达式零次或多次.例如,zo* 能匹配 "z" 以及 "zoo".* 等价于{0,}.
甘孜县17328871875: 汇编语言,编写完整的程序:两个长度为N的字符串SOURCE - STR和TARGET - STR,比较他们是否相同. - ?
大狐兴佰乐: ;比较两个字符串是否对应相同,若相同则显示“match” ;否则显示“no match”. CODE SEGMENT ASSUME CS:CODE,ds:Code START: push cs pop ds push cs pop es cld lea dx,yes lea si,SOURCE_STR lea di,TARGET_STR mov cx,N ...
甘孜县17328871875: 字符串匹配 汇编 - ?
大狐兴佰乐: int str_counts(char* p,char* f){ string t(p); int i=0; int flen = strlen(f); int counts=0; while(1){ i = t.find(f,i); //cout<<<" "; if(-1==i) brea...