本节开始学习第六单。
第六单内容主要有两点:
1.字符串的各种操作
2.掌握BCD码的调整
一、字符串操作指令
8086,8088中共有5种基本串操作指令。在串操作指令中,由变址寄存器SI指令源操作数,由变址寄存器DI指向目的操作数。规定源操作数存放在当前数据段,目的操作数存放在当前附加段内。字符串操作方向由标志寄存器中的方向标志位来确定。
当DF=0,按递增方向处理。
当DF=1,按递减方向处理。
五种串操作指令分别为: MOVS , CMPS, LODS, STOS, SCAS
1. 字符串装入指令 (Load String) LODS
LODSB ; 装入字节
LODSW ; 装入字
本指令的操作为:
字节操作: (AL) <—((SI)), (SI) <—(SI)+/-1
字操作: (AX) <—((SI)), (SI) <—(SI)+/-2
相当于 MOV AL, [SI]
INC SI 或 DEC SI
字符串装入指令只是把字符串中的一个字符装入累加器中,该指令不影响标志位
例:
MESS DB 'HELLO','0'
TAB DW 123, 342
……
MOV SI, OFFSET MESS
LODS ;LODSB
MOV SI, OFFSET TAB
LODS ;LODSW
例2:
; 子程序名: STRLWR
; 功能: 把字符串中的大写字母转化为小写字母,字符串以0结尾
; 入口参数: DS: SI 字符串首地址的段值:偏移
; 出口参数: 无
STRLWR PROC
PUSH SI
CLD
JMP SHORT STRLWR2
STRLWR1: SUB AL, ‘A’
CMP AL, 'Z' – 'A'
JA STRLWR2
ADD AL, ‘a’
MOV [SI+1], AL
STRLWR2: LODSB
AND AL, AL
JNZ STRLWR1
POP SI
RET STRLWR ENDP
2.字符串存储指令: (Save String) STOS
STOSB ; 存储字节
STOSW ; 存储字
该指令仅是把累加器的值存到字符串,即替换字符串中的一个字符
执行的操作:
字节: ((DI)) <—(AL), (DI)<—(DI)+/-1
字 : ((DI)) <—(AX), (DI)<—(DI)+/-2
等效于 MOV ES: [DI], AL
INC DI 或 DEC DI
本指令不影响标志位
例3:
如下程序片断把当前数据段中的偏移1000H开始的100字节的数据传送到从偏移2000H开始的单元中
CLD
PUSH DS
POP ES
MOV SI, 1000H
MOV DI, 2000H
MOV CX, 100D
NEXT: LODSB
STOSB
LOOP NEXT
3.字符串传送指令(Move String)MOVS
MOVSB ;字节传送
MOVSW ;字传送
执行操作:
字节传送: ((DI))<—((SI)), (DI)<—(DI)+/-1, (SI)<—(SI)+/-1
字传送: ((DI))<—((SI)), (DI)<—(DI)+/-2, (SI)<—(SI)+/-2
字符串传送指令不影响标志位
例4:
CLD
MOV CX, 100
NEXT: MOVSB
LOOPNEXT
CLD
MOV CX, 100
NEXT: MOVSW
LOOP NEXT
例5:
例3的题目使用传送指令
CLD
PUSH DS
POP ES
MOV SI, 1000H
MOV DI, 2000H
MOV CX, 100
NEXT: MOVSB
LOOP NEXT
4. 字符串扫描指令(Scan String) SCAS
SCASB ; 字节扫描
SCASW ; 字扫描
执行操作为:
字节操作: (AL)-((DI), (DI)<—(DI)+/-1
字操作: (AL)-((DI)), (DI)<—(DI)+/-2
相减的结果反映到标志位,指令不影响两个操作数
AF, CF, OF, PF, SF, ZF
下面例子判断AL中的字符是否为16进制数
STRING DB '0123456789ABCDEFabcdef'
STRINGL EQU $-STRING
CLD
MOV DX, SEG STRING
MOV ES, DX
MOV CX, STRINGL
MOV DI, OFFSET STRING
NEXT: SCASB
LOOPNZ NEXT
JNZ NOT_FOUND
FOUND:……
NOT_FOUND: ……
5.字符串比较指令:(Compare String) CMPS
CMPSB ;字节比较指令
CMPSW ;字比较指令
操作:
字节操作: ((SI))-((DI)), (SI)<—(SI)+/-1, (DI)<—(DI)+/-1
字操作 : ((SI))-((DI)), (SI)<—(SI)+/-2, (DI)<—(DI)+/-2
结果反映在各标志位,指令不影响两个操作数。