汇编语⾔系列Ⅲ实现字符串操作
软件: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
三菱plc字符串截取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 字符串输⼊及显⽰设计结果

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。