汇编语言系列之汇编实现字符串操作

软件:emu8086

语言:汇编语言(Assembly)

注意:本文列出了字符串匹配和字符串输入显示的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。

7.字符串匹配设计

7.1设计要求:

要求掌握提示信息的设置及读取键入信息的方法。设计程序,从键盘输入两个字符串进行比较,如相同,则显示“MATCH”,否则显示“NO MATCH”。

7.2设计思路:

DOS功能调用输入两个字符串,通过CMPSB指令一个字节一个字节比较字符串,相同输出MATCH,不同输出NO MATCH。

7.3程序清单:

DATA SEGMENT
 pkey DB 0DH,0AH, 'please input str1 end by enter:','$'
 qkey DB 0DH,0AH,'please input str2 end by enter:','$'
 skey DB 0DH,0AH,'MATCH','$'
 tkey DB 0DH,0AH,'NO MATCH','$' 
 BUFF1 DB 101,0,101 DUP(0)
 BUFF2 DB 101,0,101 DUP(0)`
DATA ENDS

CODE SEGMENT
 ASSUME CS:CODE,DS:DATA 
 
START: MOV AX,DATA
 MOV DS,AX
 MOV ES,AX ;数据段和堆栈段初始化
 
 LEA DX,pkey 
 MOV AH,9
 INT 21H ;DOS功能调用,输出字符串
 LEA DX,BUFF1
 MOV AH,0AH
 INT 21H ;输入第一个字符串到BUFF1缓冲区
 
 LEA DX,qkey
 MOV AH,9
 INT 21H
 LEA DX,BUFF2
 MOV AH,0AH
 INT 21H ;输入第二个字符串到BUFF2缓冲区
 
 LEA SI,BUFF1 ;将第一个字符串给SI
 LEA DI,BUFF2 ;将第二个字符串给DI
 MOV CX,53 ;给计数器值
 CLD ;清方向标准DF
 REPZ CMPSB ;一个字节一个字节比较字符串,SI和DI递增
 JZ MATCH ;全部字节都相等输出MATCH
 LEA DX,tkey
 MOV AH,9
 INT 21H ;不等输出NO MATCH
 JMP START 
 
MATCH: LEA DX,skey
 MOV AH,9
 INT 21H ;DOS功能调用,输出MATCH
 JMP START

CODE ENDS
 END START

7.4程序运行结果及分析:

主要是学会CMPSB指令的使用,清零DF标志使DI,SI递增,然后实现一个字节一个字节的比较。

图7 字符串匹配设计结果

8.字符串输入及显示设计

8.1设计要求:

要求掌握字符和数据的显示方法。设计程序,接收键盘键入字符串,包括字符和数字,并在终端显示。设计要求:有键入和结束提示信息,如在键入字符串之前提示:INPUT STRING,THE END FLAG IS $。要求统计键入字符串中数字(0-9)的个数和字符的个数,分行显示。

8.2设计思路:

判断在0~9范围内DI累加,判断在a~z和A~Z范围内SI累加,然后将SI和DI即字母个数和数字个数分别转十进制输出。

8.3程序清单:

DATA SEGMENT
 pkey DB 0dh,0ah,"input string,the end flag is $" 
 skey DB 0dh,0ah,'abc length is:','$'
 tkey DB 0dh,0ah,'num length is:','$' 
DATA ENDS

CODE SEGMENT
 ASSUME CS:CODE,DS:DATA
 
START: MOV AX,DATA
 MOV DS,AX
 MOV ES,AX ;数据段堆栈段初始化
 LEA DX,pkey
 MOV AH,9
 INT 21H ;DOS功能调用,输出字符串
 MOV DX,'$'
 MOV AH,2
 INT 21H ;DOS功能调用,输出$
 MOV DX,3AH
 MOV AH,2
 INT 21H ;DOS功能调用,输出:
 MOV DX,0DH
 MOV AH,2
 INT 21H ;DOS功能调用,归位
 MOV DX,0AH
 MOV AH,2
 INT 21H ;DOS功能调用,换行
 
 MOV SI,0
 MOV DI,0 ;清零,SI存放字母个数,DI存放数字个数
 
INPUT: MOV AH,1 
 INT 21H
 CMP AL,'$'
 JZ INEND
 CMP AL,'z'
 JA INPUT 
 CMP AL,'a'
 JAE ABC1 ;输入为a~f,SI加1
 CMP AL,'Z'
 JA INPUT
 CMP AL,'A' 
 JAE ABC1 ;输入为A~F,SI也加1
 CMP AL,'9'
 JA INPUT
 CMP AL,'0'
 JAE NUM1 ;输入为0~9,DI加1
 JMP INPUT 
 
ABC1: INC SI
 JMP INPUT 
 
NUM1: INC DI
 JMP INPUT 
 
INEND: MOV BX,0
 MOV CX,10 
 MOV AX,SI ;将字母个数给AX(十六进制转十进制) 
 
LP1: MOV DX,0
 DIV CX ;AX表示的32位数除以10,商放在AX,余数放在DX
 PUSH DX ;将余数压入栈
 INC BX
 CMP AX,0 ;商不为0就继续除10
 JNZ LP1
 LEA DX,skey
 MOV AH,9
 INT 21H ;DOS功能调用,输出字符串

LLP1: POP DX ;DX中数据依次出栈并显示
 ADD DX,30H
 MOV AH,2
 INT 21H ;DOS功能调用,输出字母个数
 DEC BX
 JNZ LLP1
 MOV BX,0 
 MOV AX,DI ;将数字个数给AX(十六进制转十进制)
 
LP2: 
 MOV DX,0 
 DIV CX ;AX表示的32位数除以10,商放在AX,余数放在DX
 PUSH DX ;将余数压入栈
 INC BX
 CMP AX,0
 JNZ LP2 ;商不为0就继续除10
 LEA DX,tkey
 MOV AH,9
 INT 21H ;DOS功能调用,输出字符串
 
LLP2: POP DX ;DX中数据依次出栈并显示
 ADD DX,30H
 MOV AH,2
 INT 21H ;DOS功能调用,输出数字个数
 DEC BX
 JNZ LLP2 
 JMP START
 
CODE ENDS
 END START

8.4程序运行结果及分析:

当输入字母或数字个数大于10之后统计输出比较麻烦,这里使用了除以10循环并存入堆栈再依次输出的方法实现输出。

图8 字符串输入及显示设计结果

作者:BoBoRing原文地址:https://www.cnblogs.com/BoBoRing/p/10240891.html

%s 个评论

要回复文章请先登录注册