汇编学习笔记37

第六单

二、串指令的重复前缀

由于串操作指令每次只能对字符串中的一个字符进行操作,进行操作时总是要使用一个循环。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

posted @ 2011-01-06 20:34  杨海龙  阅读(427)  评论(0编辑  收藏  举报