汇编语言之串处理操作
基础知识
SHL为逻辑座椅命令,其中OPR为寄存器或者内存单元,移位次数可以是1或者CL寄存器,如需移位的次数大于1,则可以在该移位指令前把移位次数先送CL寄存器中。
LOOP为循环指令,当CX≠0时循环,LOOPZ/LOOPE为当为零/相等时循环,换句话说即当ZF=1且CX≠0时循环。LOOPNZ/LOOPNE当不为零/不相等时循环,换句话说当ZF=0且CX≠0时循环。
条件转移指令是根据上一条指令执行后,所才产生的标志位来进行测试条件判别。所以在使用条件转移指令之前,应有一条能产生标志位的前导指令,如CMP指令。
实验内容
在数据段有如下定义:
BUFFDB ‘ABD$EFGHUJK$’
STR1DB 12 DUP(?)
LENDB ?
1. 对字符串STR1全部置‘*’符。
程序设计思路
根据串的长度,设置CX的值,之后采用LOOPNE指令,循环中将*放入串中即可。
程序代码
assembly
DATAS SEGMENT
BUFF DB 'ABCD$EFGHIJK$'
STR1 DB 12 DUP(?)
LEN DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,12
MOV BX,0
MOV DL,'*'
DOIT:
MOV STR1[BX],DL
INC BX
LOOPNE DOIT
MOV AH,4CH
INT 21H
CODES ENDS
END START
2. 从左到右把BUFF中的字符串传送到STR1.
程序设计思路
根据串的长度,首先设置好CX寄存器的值,同时设置好DS:SI与ES:DI然后采用REP MOVSB指令完成串的转移。
程序代码
assembly
DATAS SEGMENT
BUFF DB 'ABCD$EFGHIJK$'
STR1 DB 12 DUP(?)
LEN DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
LEA SI,OFFSET BUFF
LEA DI,OFFSET STR1
MOV CX,12
CLD
REP MOVSB
MOV AH,4CH
INT 21H
CODES ENDS
END START
3. 从右到左把BUFF中的字符传送到STR1中。
程序设计思路
与上题不同之处,就是方向相反。反向可以使用变量,让其每次减一,每次复制一个字符,这样就可以完成逆向转移。
程序代码
assembly
DATAS SEGMENT
BUFF DB 'ABCD$EFGHIJK$'
STR1 DB 12 DUP(?)
LEN DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV CX,13
LEA SI,OFFSET BUFF
ADD SI,12
LEA DI,OFFSET STR1
DOIT:
MOV BL,DS:[SI]
MOV ES:[DI],BL
INC DI
DEC SI
LOOP DOIT
MOV AH,4CH
INT 21H
CODES ENDS
END START
4. 比较BUFF与STR1两个字符串是否相等,如相等则DX=1,否则DX=0.
程序设计思路
设置好相关变量后,采用REPE CMPSB指令,根据退出循环时CF标志位的值,来判断两个字符串是否相等。
程序代码
assembly
DATAS SEGMENT
BUFF DB 'ABCD$EFGHIJK$'
STR1 DB 'ABCD$DDEEFF$'
LEN DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
LEA SI,BUFF
LEA DI,STR1
CLD
MOV CX,13
REPE CMPSB
MOV DX,1
JNZ NOTOK
JMP EXIT
NOTOK:
MOV DX,0
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
5.查找BUFF中有无字符$,把字符出现的次数计入BX寄存器。
程序设计思路
设置好先关寄存器的值,然后循环判断,如果找到$,计数器自增。
程序代码
assembly
DATAS SEGMENT
BUFF DB '$$$$$EFGHIJK$'
STR1 DB 12 DUP(?)
LEN DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
LEA SI,OFFSET BUFF
MOV CX,13
MOV BX,0
MOV DL,'$'
DOIT:
CMP DL,DS:[SI]
INC SI
INC BX
JC NOTOK
JMP BACK
NOTOK: DEC BX
BACK:
LOOP DOIT
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START