您的位置:首页 > 编程语言

【80X86汇编语言学习】【字符串处理】字符串操作指令REPNZ/REPNE

2015-08-03 22:17 531 查看
REPNZ用作为一个串操作指令的前缀,它重复气候的串操作指令动作。没重复一次CX的值减一,重复一直进行到CX为0,获知串操作指令使零标志ZF为1时止。

重复操作指令REPNZ主要用在字符串扫描指令SCAS之前,重复前缀REPNZ与

SCASB指令配合,表示当不等时继续扫描,一直搜索到字符串结束。如果搜索到,则ZF标志位1,

CX的值可能为0;如果没有搜索到,则ZF标志为0,CX之值一定为0

例子 :编写程序测试字符串的长度。字符串是以0结尾。MLENGTH = 128 ;定位常量,缓冲区最大的长度

DSEG SEGMENT
BUFF DB MLENGTH ;第一个字节存放缓冲区的最大值
DB ? ;第二个字节存放实际字符串的长度
DB MLENGTH DUP (0) ;真实字符串
MESSG0 DB 'Please input:$'
MESSG1 DB 'Length = $'
DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX ;设置DS寄存器
MOV DX,OFFSET MESSG0 ;显示提示信息
CALL DISPMESS

MOV DX,OFFSET BUFF ;获取一个字符串从标准输入设备
MOV AH,0AH
INT 21H
CALL NEWLINE ;输入换行和回车
;

;下面的程序的意思是将字符串最后添加为0
MOV AX,SEG BUFF
MOV ES,AX
MOV CL,BUFF+1
XOR AH,AH
MOV DI,OFFSET BUFF+2
ADD DI,CX ;获取字符串的最后一个字符
MOV BYTE PTR ES:[DI],0H ;添加为0
;
MOV DI,OFFSET BUFF+2
CALL STRLEN ;调用函数获取长度
MOV BX,AX
;
MOV DX,OFFSET MESSG1 ;显示提示信息
CALL DISPMESS
MOV AX,BX
CALL DISPAL ;显示保存AL中的字符串长度
;
MOV AX,4C00H
INT 21H ;结束
;显示有DX所指的提示信息
DISPMESS PROC
MOV AH,9
INT 21H
RET
DISPMESS ENDP

;显示换行符和回车符
NEWLINE PROC
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
NEWLINE ENDP

;子程序名:DISPAL
;功 能:用十进制数的形式显示8位二进制数
;入口参数:AL = 8 位二进制数
;出口参数:无

;用十进制显示8位二进制
DISPAL PROC

MOV CX,3 ;8位二进制数最大表示为3为十进制数
MOV DL,10 ;除数为10
DISP1: DIV DL ;AX/DL=AL(商) AH(余数)
XCHG AH,AL ;交换AL,AH,使AL保存余数
ADD AL,'0' ;转换为ASCII码
PUSH AX ;将Ax保存到栈中,其中主要用到AL,后续显示过程会用到AL
XCHG AH,AL ;是AL中继续保持商
MOV AH,0 ;清空AH
LOOP DISP1 ;继续循环测试
;
MOV CX,3
DISP2: POP DX
CALL ECHOCH
LOOP DISP2
RET
DISPAL ENDP

ECHOCH PROC
MOV AH,2
INT 21H
RET
ECHOCH ENDP

;子程序名:STRLEN
;功 能:测试字符串的长度
;入口参数:ES:DI = 字符串的首地址
;出口参数:AX = 字符串的长度
;说 明:字符串以0结尾,字符长度不包括结尾标志
STRLEN PROC
PUSH CX
PUSH DI
CLD
XOR AL,AL ;使AL中包含结束标志
MOV CX,0FFFFH
REPNZ SCASB ;搜索结束标志0
MOV AX,CX
NOT AX
DEC AX
POP DI
POP CX
RET
STRLEN ENDP

CSEG ENDS
END START
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息