汇编学习笔记36

本节开始学习第六单。

第六单内容主要有两点:

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

结果反映在各标志位,指令不影响两个操作数。

原文地址:https://www.cnblogs.com/hailong/p/1926745.html