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

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

2015-07-26 18:07 369 查看
80X86汇编提供的字符串操作指令,每次只能处理一个字或字节,所以需要提供一个循环。而8086提供了一个“重复前缀”REP,

REP重复执行后面的串操作指令,每一次执行,都先判断CX是否为0,如果CX为0,则结束重复;否则CX 减一,重复其后的串操作指令。

REP主要用在串操移动指令MOVS 和串存储指令STOS

CLD
MOV		CX,50
REP		STOSW


例子:提示输入一个字符,用输入的字符填充缓冲区

;FILLB
;测试用指定的字符填充指定的缓冲区

DSEG SEGMENT

MESS1	DB	'Please input:',0
BUFFER	DB	10 DUP (0)
LEN_BUFF EQU	$ - BUFFER
DSEG ENDS

CSEG	SEGMENT
ASSUME	DS:DSEG,CS:CSEG
START:	        MOV	AX,DSEG
MOV	DS,AX
;
MOV	SI,OFFSET MESS1          ;显示提示信息
CALL	DMESS
MOV	AH,1			 ;接收一个字符
INT	21H
;
MOV	BX,SEG BUFFER
MOV	ES,BX
MOV	DI,OFFSET BUFFER
MOV	CX,LEN_BUFF
CALL FILLB
;
CALL	NEWLINE
MOV	CX,LEN_BUFF
MOV	SI,OFFSET BUFFER
NEXT:	        MOV	AL,[SI]
CALL	PUTCH
INC	SI
DEC	CX
JNZ	NEXT
EXIT:	        MOV	AX,4C00H
INT	21H

;子程序名:PUTCH
;功     能:显示一个字符
;入口参数:AL = 需要显示的字符
;出口参数:无

PUTCH	PROC
PUSH	DX
MOV	DL,AL
MOV	AH,2
INT	21H
POP	DX
RET
PUTCH	ENDP

;子程序名:DMESS
;功     能:显示一个以0为结束符的字符串
;入口参数:SI = 字符串首地址
;出口参数:无

DMESS	PROC

DMESS1:	MOV	DL,[SI]
INC	SI
OR	DL,DL
JZ	DMESS2
MOV	AH,2
INT	21H
JMP	DMESS1
DMESS2:	RET
DMESS	ENDP

;
;子程序名:NEWLINE
;功	    能:	形成回车和换行
;入口参数:无
;出口参数:无
;说     明:通过显示回车符形成回车,通过显示换行符形成换行

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

NEWLINE	ENDP

;子程序名:FILLB
;功	    能:	用指定字符填充指定缓冲区
;入口参数:ES:DI = 缓冲区首地址
;           CX = 缓冲区长度,AL = 填充字符
;出口参数:无
FILLB	PROC
PUSH	AX
PUSH	DI
JCXZ	FILLB_1
CLD             ;使DI指针递增
SHR	CX,1    ;CX 、2,将字节数转换为字的个数
MOV	AH,AL
REP	STOSW	;按字进行填充
JNC	FILLB_1 ;如果缓冲区长度为偶数,则转移
STOSB           ;如果缓冲区的长度为奇数,则单独进行按字节进行填充
FILLB_1:	POP	DI
POP	AX
RET
FILLB	ENDP

CSEG	ENDS

END START


效果如下:



在子程序FILLB中

SHR		CX,1
MOV		AH,AL
REP		STOSW
JNC		FILLB_1


SHR是CX右移以为,会将最低位移动到CF位中,如果CX是奇数,执行指令

SHR    CX,1 会是CF 中为1

所以JNC  FILLB_1根据CF位来判断CX是否为奇数,


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