第六单
二、串指令的重复前缀
由于串操作指令每次只能对字符串中的一个字符进行操作,进行操作时总是要使用一个循环。8086,8088提供了重复操作前缀,用于重复串操作。
1. REP
重复后面的操作。每次执行重复指令前,判断CX,如果CX=0,结束指令,否则,执行前缀后的串操作。
REP前缀主要用于MOVS和STOS前,一般不在LODS前使用任何重复前缀。
例:
; 子程序名: FILLB
; 功能: 填充缓冲区
FILLB PROC
PUSH AX
PUSH DI
JCXZ FILLB_1
CLD
SHR CX, 1
MOV AH, AL
REP STOSW
JNC FILLB_1
STOSB
FILLB_1: POP DI
POP AX
RET
FILLB ENDP
2.REPZ REPE
CX=0或ZF=0时,停止操作
主要用于CMPS 和SCAS前。由于MOVS和STOS不影响标志位,在这些串操作前使用REPZ和REP效果是一样的,但是通常在MOVS和STOS前使用REP
例:
; 子程序名: STRCMP
; 功能: 比较字符串是否相同
; 入口参数: 两个字符串分别存放在段值:偏移地址为 DS: SI 和ES: DI中
; 出口参数: 如果AX=0,则两字符串相同,否则,不同
; 说明: 字符串以0结束
STRCMP PROC
CLD
PUSH DI
XOR AL, AL
MOV CX, 0FFFFH
NEXT: SCASB
JNZ NEXT
NOT CX
POP DI
REPZ CMPSB
MOV AL, [SI-1]
MOV BL, ES: [DI-1]
XOR AH, AH
MOV BH, AH
SUB AX, BX
RET
STRCMP ENDP
3. REPNZ REPNE
CX=0或ZF=1时,停止重复
主要用于串扫描指令
例:
假设数据段
CONAME DB 'SPACE EX……' ;20Byte
PLINE DB 20DUP(' ')
用串指令完成
1)从左至右把CONAME内容传入PLINE
2)从右至左把CONAME内容传入PLINE
3)把CONAME第3个和第4个字节内容传入AX
4)把AX存入PLINE+5开始的单元中
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH AX
MOV AX, SEG CONAME
MOV DS, AX
MOV AX, SEG PLINE
MOV ES, AX
1. LEA SI, CONAME
LEA DI, PLINE
CLD
MOV CX, 20
REP MOVSB
2. LEA SI, CONAME+19
LEA DI, PLINE+19
STD
MOV CX, 20
REP MOVSB
3. MOV SI, CONAME+2
LODSW
4. MOV DI, PLINE+5
MOV CX, 2
CLD
REP STOSB