软件:emu8086
语言:汇编语言(Assembly)
注意:本文列出了字符串匹配和字符串输入显示的代码,全部代码为博主独自一人编写,会有瑕疵,谨慎使用。
7.字符串匹配设计
7.1设计要求:
要求掌握提示信息的设置及读取键入信息的方法。设计程序,从键盘输入两个字符串进行比较,如相同,则显示“MATCH”,否则显示“NO MATCH”。
7.2设计思路:
DOS功能调用输入两个字符串,通过CMPSB指令一个字节一个字节比较字符串,相同输出MATCH,不同输出NO MATCH。
7.3程序清单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73DATA 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程序清单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136DATA 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
最后
以上就是疯狂中心最近收集整理的关于汇编语言系列Ⅲ 实现字符串操作的全部内容,更多相关汇编语言系列Ⅲ内容请搜索靠谱客的其他文章。
发表评论 取消回复