我是靠谱客的博主 疯狂中心,最近开发中收集的这篇文章主要介绍汇编语言系列Ⅲ 实现字符串操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

软件: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 字符串输入及显示设计结果

 

转载于:https://www.cnblogs.com/BoBoRing/p/10240891.html

最后

以上就是疯狂中心为你收集整理的汇编语言系列Ⅲ 实现字符串操作的全部内容,希望文章能够帮你解决汇编语言系列Ⅲ 实现字符串操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部