汇编语言之串处理操作

汇编语言之串处理操作

基础知识

  1. SHL为逻辑座椅命令,其中OPR为寄存器或者内存单元,移位次数可以是1或者CL寄存器,如需移位的次数大于1,则可以在该移位指令前把移位次数先送CL寄存器中。

  2. LOOP为循环指令,当CX≠0时循环,LOOPZ/LOOPE为当为零/相等时循环,换句话说即当ZF=1且CX≠0时循环。LOOPNZ/LOOPNE当不为零/不相等时循环,换句话说当ZF=0且CX≠0时循环。

  3. 条件转移指令是根据上一条指令执行后,所才产生的标志位来进行测试条件判别。所以在使用条件转移指令之前,应有一条能产生标志位的前导指令,如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

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值