您的位置: 网站首页 > 程序开发 > 汇编语言与微机原理教程 > 第9章 80x86的寻址方式与指令系统 > 【9.3.6 串处理指令】

9.3.6 串处理指令

 

9.3.6  串处理指令

字符串操作指令的实质是对一片连续的存储单元进行处理,这片存储单元是由DSSIESDI来指定的。字符串操作指令可对内存单元按字节或字进行处理,并能根据操作对象的规定使SIDI)增减,具体规定如下:

·    DF=0时,变址寄存器SI(或DI)增加12

·    DF=1时,变址寄存器SI(或DI)减少12

在使用串指令前,须先进行以下设置。

·    必须事先设置隐含的寄存器。

·    设置方向标志位DF

·    如果使用重复前缀,还必须把重复次数放入CX中。

1.串指令的形式及功能

1LODS——取字符串数据指令。

形式:LODS  地址表达式。

功能:AL/AXDSSI),调整SI

该指令还有如下两种形式:

LODSB       ;AL←(DSSI,SISI±1

LODSW       ;AX←(DSSI,SISI±2

2STOS——置字符串数据指令。

形式:STOS  地址表达式。

功能:ESDI)←AL/AX,调整DI

该指令还有如下两种形式:

STOSB       ;ESDI)←AL,DIDI±1

STOSW       ;ESDI)←AX,DIDI±2

3MOVS——传送字符串指令。

形式:MOVS  地址表达式。

功能:ESDI)←DSSI),调整SIDI

该指令还有如下两种形式:

MOVSB       ;ESDI)←(DSSI,SISI±1DIDI±1

MOVSW       ;ESDI)←(DSSI,SISI±2DIDI±2

4CMPS——比较字符串指令。

形式:CMPS  地址表达式。

功能:ESDI-DSSI),结果影响标志位,调整SIDI

该指令还有如下两种形式:

CMPSB       ; ESDI- DSSI),结果影响标志位,SIS1±1DIDI±1

CMPSW       ; ESDI- DSSI),结果影响标志位,SISI±2DIDI±2

5SCAS——扫描字符串指令。

形式:SCAS  地址表达式。

功能:ESDI-AL/AX,结果影响标志位,调整DI

该指令还有如下两种形式:

SCASB       ; ESDI-AL,结果影响标志位,DIDI±1

SCASW       ; ESDI-AX,结果影响标志位,DIDI±2

9-9编写一段程序,计算数字字符串‘123456789’中的各数值之和。

注意:我们可循环地取出字符串中的字符,转换为数字,然后累加到BX

源程序:

.MODEL SMALL

.STACK 100H

.DATA

MESS DB ' 123456789'

.CODE

start:  MOV AX,SEG MESS

MOV DS,AX

LEA SI,MESS

MOV CX,9

CLD   

MOV AH,0

MOV BX,0

Again:LODSB

AND AL,0FH

ADD BX,AX

LOOP again

.EXIT 0

END Start

在调试环境下运行程序,可以看到BX寄存器的内容为002DH

2.重复前缀

重复前缀只能用在串操作指令的前面,重复次数应事先设置在CX中。有3种形式的重复前缀。

1REP——重复前缀。

形式:REP 传送字符串指令或置字符串指令。

功能:步骤1,如果CX=0,则退出循环,执行步骤2的语句;步骤2,如果CX)≠0,则执行所写串操作指令一次且CX=CX-1,转步骤1

例如:

REP  MOVSB

REP  MOVSW

REP  STOSB

REP  STOSW

2REPE/REPZ——相等重复前缀。

形式:REPE/REPZ  扫描字符串指令或比较字符串指令。

功能:步骤1,如果CX=0ZF=1,则退出循环;步骤2,如果CX)≠0ZF=0,则执行所写串操作指令一次且CX=CX-1,转步骤1

例如:

REPE/REPZ  SCASB

REPE/REPZ  SCASW

REPE/REPZ  CMPSB

REPE/REPZ  CMPSW

显然,该重复前缀只能使用在影响ZF标志位的串指令前。

3REPNE/REPNZ——不相等重复前缀。

形式:REPNE/REPNZ  扫描字符串指令或比较字符串指令。

功能:步骤1,如果CX=0ZF=0,则退出循环;步骤2,如果CX)≠0ZF=1,则执行所写串操作指令一次且CX=CX-1,转步骤1

例如:

REPNE/REPNZ SCASB

REPNE/REPNZ SCASW

REPNE/REPNz CMPSB

REPNE/REPNZ CMPSW

显然,该重复前缀也只能在影响ZF标志位的串指令前使用。

9-10将显示器缓冲区的内容传送到dBuf变量中,长度为2000字,然后将显示器缓冲区写入空格,完成清屏功能。

注意:显示器缓冲区的首地址为0B800H0000H,我们可通过置字符串指令完成清屏功能。

源程序:

.MODEL  SMALL

.STACK  i00H

.DATA

dScreen DD 0B8000000h

wBuf DW 2000 DUP?

dBuffAdd DD WBuf

.CODE

start:    MOV  AX,@DATA

MOV     DS,AX

CLD

MOV     CX,2000

LES     DI,dBuffAdd

LDS     SI,dScreen

REP     MOVSW

LES     DI,dScreen

MOV     CX,2000

MOV     AX,2020H

REP     STOSW

.EXIT   0

END     start

运行结果:

清屏。