课前复习指令系统: 1 .mov ds,2010h ; 错 不能将立即数直接给段寄存器 2...

47
课课课课课课课1 .MOV DS,2010H ;课 课课课课课课课课课课课课课 2 .PUSH AL ;课 课课课课课课课课课课课 3 .MOV DX, [SP] ;课 课 [SP] 课课课课 课课课课课 课课课课 BX,BP,SI,DI 课课 4 .IN AL,0A00H ;课 课课课课课课 FFH 课课 DX 课课课课 5 .XCHG CL,CH ;课 第第第 第第第 8086/8088 8086/8088 第第第 第第 () 第第第 第第 () 2006 2006 10 10 31 31 第第第第 () 第第第第 ()

Upload: camila

Post on 11-Jan-2016

432 views

Category:

Documents


0 download

DESCRIPTION

第七讲 8086/8088 指令系统(续) 2006 年 10 月 31 号(星期二). 课前复习指令系统: 1 .MOV DS,2010H ; 错 不能将立即数直接给段寄存器 2 .PUSH AL ; 错 不能对字节进行堆栈操作 3 .MOV DX, [SP] ; 错 无 [SP] 寻址方式,存储器地址 只能通过 BX,BP,SI,DI 寻址 4 .IN AL,0A00H ; 错 端口地址大于 FFH 应用 DX 寻址端口 5 .XCHG CL,CH ; 对. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

课前复习指令系统:

1 .MOV DS,2010H ; 错 不能将立即数直接给段寄存器

2 .PUSH AL ; 错 不能对字节进行堆栈操作

3 .MOV DX, [SP] ; 错 无 [SP] 寻址方式,存储器地址只能通过 BX,BP,SI,DI 寻址

4 .IN AL,0A00H ; 错 端口地址大于 FFH

应用 DX 寻址端口

5 .XCHG CL,CH ; 对

第七讲第七讲 8086/80888086/8088 指令系统(续)指令系统(续)20062006 年年 1010 月月 3131 号(星期二)号(星期二)

Page 2: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

6 .AAA CX ; 错 AAA 为无操作数指令 , 默认操作数 AL

7 .ADD [BP+DI],[1000H] ; 错 两个操作数不能均为存储器 8 .OUT DX,CL ; 错 端口只能通过 AL 或 AX 传送数据

9.CBW BH ; 错 符号扩展命令为无操作数指令 , 默认操作数 AL

10.ADD 03ECH,AX ; 错 目的操作数不能为立即数

11.MOV BX,[SP+DI]; 错 无 [SP+DI] 寻址 , 必须是基址 (BX 或 BP)+ 变址 (SI 或 DI)

12.MOV DI,[AX] ; 错 无 [AX] 寻址

Page 3: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

13.LDS CH,[DI] ; 错 LDS 指令目的操作数应为一个 16 为寄存器

14.LEA BX,1000H ; 错 LEA 源操作数应为一个存储器操作数 , 不能是立即数

15.DIV 0010H ; 错 单操作数不能是立即数

16.LEA DX,DI ; 错 LEA 源操作数应为一个存储器操作数 , 不能是寄存器

17.MUL AX,200H ; 错 MUL 为单操作数指令 , 且源操作数不能为立即数 ,AX 隐含

18.MOV AX,[BX+BP]; 错 无 [BP+BX] 寻址 , 理由同第 12 题

Page 4: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

19.CMP [BX],[SI] ; 错 双操作数不能均为存储器

21.OUT DX,BX ; 错 端口只能通过 AL 或 AX 传送数据

22.AND 0FH,AL ; 错 目的操作数不能为立即数23.JNZ AAA ; 错 AAA 十一条指令 . 不能作为符号地址

Page 5: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

例 1 复习求补指令: MOV AH, 80H

NEG AH

00 H 0000 0000 B - 80 H - 1000 0000 B 1 1 80H 1000 0000B

执行后: ( AL ) =80H , CF=1 , OF=1 , ZF=0 , SF=1 , AF = 0 , PF=0

Page 6: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

CMP oprd1, oprd2 ; (oprd1) - (oprd2)

CMP A, B

利用 CMP 执行后的标志值,比较两操作数之间的关系

比较指令 CMP ,进行两操作数相减操作, 但只影响标志值,不影响操作数 ( 减的结果不保存 )

例 2 :复习比较指令:

条件转移指令 判断条件

低于 JB next CF = 1

低于或等于 JBE next CF = 1 或 ZF = 1

高于 JA next CF = 0 且 ZF = 0

高于或等于 JAE next CF = 0

有符号数小于用 JL ,大于用 JG

Page 7: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

例 将 AX 和 BX 中较大的带符号数,存于 AX 中

CMP AX, BX ; 比较 JGE great ; 大于或等于则跳转 XCHG AX, BX ; 小于则交换

great: 、、、

CMP A , B

Page 8: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

CMP 指令应用举例:带符号数找最大值 带符号数找最大值 若自 BLOCK 开始的内存缓冲区中,有 100 个带符号数。

找出最大值。并存放到 MAX 单元中。

思路:思路:• 第一个数取出 ( AX) , • 取出第二个数(第二个字单元内容)与 (AX) 比较 :

( AX ) > 第二个数,不做交换,

否则,(第二个字单元内容) ( AX )。

• 再取第三个数,

• 经过 99 次比较,在( AX )中得到最大数。

Page 9: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

编程: MOV BX , OFFSET BLOCK

MOV AX , [BX]

INC BX

INC BX

MOV CX , 99

AGAIN : CMP AXCMP AX ,, [BX][BX]

JG NEXTJG NEXT ; (AX) 大,转 NEXT MOV AX , [BX]

NEXT: INC BX

INC BX

DEC CX

JNZ AGAIN

MOV MAX , AX ; MAX 单元存放最大值

Page 10: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

8086/80888086/8088 指令系统(续)指令系统(续)

8086/80888086/8088 指令系统可以分成指令系统可以分成 66 个功能组:个功能组:11 .. 数据传送数据传送 (Data transfer)(Data transfer)22 .. 算术运算(算术运算( ArithmeticArithmetic ))33 .. 逻辑运算和移位指令逻辑运算和移位指令 (Logic& Shift)(Logic& Shift)44 .. 串操作串操作 (String manipulation)(String manipulation)55 .. 控制转移(控制转移( Control TransferControl Transfer ))66 .. 处理器控制(处理器控制( Processor ControlProcessor Control ))

Page 11: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

三 . 逻辑运算指令

逻辑指令指令分类

逻辑运算 AND、OR、XOR、NOT、TEST

移 位 SHL 、SAL 、SHR、 SAR

循环移位 ROL 、ROR 、RCL 、RCR

Page 12: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

1. 逻辑运算指令AND AL , 0000 1111B

OR BX , 00FFH

NOT CL

XOR DL, AL

TEST AL, 0000 0001B

除 NOT 指令单操作数外,其它均为双操作数 可进行字节或字操作 NOT 指令不影响标志

TEST 为“与”操作,但只影响标志位,不影响操作数。

其他指令置 CF 、 OF 为 0 , AF 不定 ( 无意义 )

SF 、 ZF 、 PF 据结果置位

Page 13: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

以“与”指令为例,讨论注意事项:• ““ 与”指令中操作数不能同时为存储器;与”指令中操作数不能同时为存储器;• 影响条件码: CF = 0F=0 , AF 未定义 , SF ZF PF

↕   ↕   ↕

“ 与”指令的用途:

(1) 清清 CF , CF , 自己“与”自己自己“与”自己 . . 操作数不变 ,操作数不变 , CF=0CF=0

例: AND AL , AL ; 结果:操作数不变 ,操作数不变 , CF=0CF=0 。

(2) 使操作数中若干位保持不变,若干位与“操作数中若干位保持不变,若干位与“ 1”1” 相与相与;

而若干位置为“若干位置为“ 0 “0 “ 的场合,若干位与“的场合,若干位与“ 0” 0” 相与相与。

例: 若( AL)=433H

AND AL, 0FFH ; (AL)=03H, (AL)(AL)0~30~3 不变不变;

;(AL)(AL)4~74~7=00H,=00H, 屏蔽高屏蔽高 44 位位。

Page 14: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

2. 移位指令

SHL oprd, 1CL

SAL oprd, 1CL

SHR oprd, 1CL

SAR oprd, 1CL

0CF

0CF

CF0

CF

执行操作指令格式

左移部分逻辑移位与算术移位

Page 15: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

3. 循环移位指令

指令格式 执行操作

CF

CF

CF

CF

ROL oprd, 1CL

ROR oprd, 1CL

RCL oprd, 1CL

RCR oprd, 1CL

循环移位分带进位与不带进位两种

Page 16: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

共同点:• 所有移位指令都可以作 B/W 操作。 • 指令中的 dest : dest : 寄存器、存储器寻址方式。寄存器、存储器寻址方式。• cnt : 表示移位次数

cnt=1 , 1 可写在指令中,不能是 1 以外的常数。 cnt>1 ,用 CL 存放移位次数 , 不能是其他寄

存器。

如: SAL AX , 1

MOV CL , 4

SAL AX , CL

Page 17: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

注意事项:

SHL AL, 1 SHR AL, CL ROL BX, 1 RCR AL, CL

源操作数为移位的次数 为 1 可在指令中直接给出 大于 1 时,移位次数需由 CL 给出

RCR AX , 5 SHL BL, AL

目的操作数类型决定操作类型SAL BL , CL 字节操作ROL BX , CL 字操作

当移位次数

oprd 可以是 reg/mem

可进行字节或字操作

Page 18: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

循环移位指令循环移位指令( Rotate) 与移位指令与移位指令 (Shift) 不同点不同点:

• 移位指令执行后,移出的位可能丢失; 循环移位指令移位后,操作数中原来各数位的信息不会丢失,这是移动了位置,必要时可以恢复。

• 循环移位指令可以对操作数进行测试。

例:测试 (AL)5 =? 0

MOV CL , 3ROL AL , CLROL AL , CLJNC ZERO

…ZERO: …

Page 19: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

• 利用带进位循环移位指令将两个寄存器或存储器单元利用带进位循环移位指令将两个寄存器或存储器单元 组合起来一起移位组合起来一起移位。

例: 将 DX 、 AX 组合起来构成 32 位寄存器向左移一位。如下图所示:

015015 DX AX

程序: SHL AX , 1 RCL DX , 1

32 位寄存器向左移一位

Page 20: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

四、串操作指令( String manipulation )

“ 串”就是内存中一段地址相连的字节或字。 串操作—对串中各项进行操作,也叫数据块操作串操作—对串中各项进行操作,也叫数据块操作。 串操作指令是 8088实现内存之间数据传送的一组指令

8088 有 5种基本操作:

1 、 MOVS ( Move string ) 串传送指令 2 、 CMPS ( Compare string ) 串比较指令 3 、 SCAS ( Scan string ) 串扫描指令 4 、 LODS ( Load from string ) 串取数指令 5 、 STOS ( Store in to string ) 存入串数据指令

Page 21: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

共同点:共同点:

• 可以只有源操作数,可以只有目标操作数,可能二者都有。

• 源操作数用 SI 寻址,隐含 DS 值为段地址,可以用段跨越前缀指定其它段。

• 目标操作数用 DI 寻址,隐含 ES 为段地址。

• 每次操作对 SI 、 DI 调整:DF=1DF=1 ,, DIDI 、、 SISI 自动自动 -1 (-1 ( 字节)或字节)或 -2-2 (字);(字);DF=0DF=0 ,, DIDI 、、 SISI 自动自动 +1+1 (字节)或(字节)或 +2+2 (字)。(字)。

• 与上述指令基本配合使用前缀有:

REPREP ( Repeat )重复。重复。

REPE/REPZREPE/REPZ ( Repeat while equal/zero ) 相等相等 // 为零则重复。为零则重复。

REPNE/REPNZREPNE/REPNZ ( Repeat while not equal/not zero )不相等不相等 // 不为零则重复不为零则重复。

Page 22: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

下面分二种情况来讨论:

( 一 ) 与 REP 相配合工作的 MOVS 、 STOS 指令

REP 重复串操作直到( CX ) =0 为止

LODS 指令一般不直接与 REP联合使用,但其操作与 STOS 相关,因而放在这里。

(二 ) 与 REPE/REPZ和 REPNE/REPNZ联合工作的 CMPS和 SCAS 指令

REPE/REPZ 当相等 / 为零时重复串操作

REPNE/REPNZ 当不相等 / 不为零时重复串操作

Page 23: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

(( 一一 ) ) 与与 REPREP 相配合工作的相配合工作的 MOVSMOVS 、、 STOSSTOS 指令指令

• REP REP 重复串操作直到(重复串操作直到( CXCX )) =0=0 为止为止

格式: REP String Primitive 串指令

String Primitive 可为: MOVS 、 STOS 。

1. MOVS ( Move String ) 串传送

2. LODS(Load from String) 读串指令

3. STOS ( Store into String ) 写串指令

Page 24: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

• REP REP 重复串操作执行过程重复串操作执行过程 ::

(1)当 (CX)= 0 ,结束 REP ,

执行 REP 后的下一条指令。

(2) 当 (CX)≠0 ,

(CX) (CX) -1 ,

(3) 执行 REP 后的串指令,

(4) 重复 (1)~( 3 )。

REP 执行流程图

(CX)=0?Y

(CX) (CX)-1

执行下一条指令

REP执行 后的串指令

N

Page 25: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

1.1. MOVSMOVS (( Move stringMove string )串传送)串传送

串传送有串传送有 33种格式:种格式:

(1) MOVS dest , src ;(( ES ):( DI )←(( DS ):( SI ))

(2) MOVSB (字节) ; ( SI )←( SI ) ±1 ,( DI )←( DI ) ±1

(3) MOVSW (字);( SI )←( SI ) ±2 ,( DI )←( DI )±2

当方向标志 当方向标志 CLD , DF=0CLD , DF=0 时 用“时 用“ +”+”

STD , DF=1STD , DF=1 时 用“时 用“ -”-”

该指令不影响条件码 。

* 如: MOVS ES : BYTE PTR [DI] , DS : [SI]

* MOVMOV 单指令不能完成 存储单元之间的数据传送存储单元之间的数据传送;

MOVSMOVS 指令就是为解决 存储单元之间数据传送而设置的。指令就是为解决 存储单元之间数据传送而设置的。

Page 26: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

例:将内存的数据段中以 AREA1 为首地址的 100 个数据,传送到附加段中的 AREA2 为首地址的区域。

用 MOVS 串操作指令编程: MOV AX , SEG AREA1

MOV DS , AX

MOV AX , SEG AREA2

MOV ES , AX

MOV SIMOV SI ,, OFFSET AREA1OFFSET AREA1

MOV DIMOV DI ,, OFFSET AREA2OFFSET AREA2

MOV CXMOV CX ,, 100100

CLDCLD ; DF=0 ,增址传送

REP MOVS MOVS ES : BYTE PTR[DI], DS : [SI]

Page 27: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

应用应用 MOV 指令编程: MOV AX , SEG AREA1

MOV DS , AX

MOV AX , SEG AREA2

MOV ES , AX MOV SI , OFFSET AREA1 ;将 ARE1偏移地址→ SI

MOV DI , OFFSET AREA2

MOV CX , 100

LOOP1 : MOV AL , [SI] ; ( AL )←(( DS ):( SI ))

MOV ES : [DI] , AL ;(( ES ):( DI ))←( AL )

INC SI

INC DI

DEC CX

JNE LOOP1

Page 28: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

归纳在执行 MOVS 指令时,应该先做好以下准备工作:(1) 数据段中源串首地址(如反向传送到末地址)存入 SI 寄存器中。

(2) 附加段中目的串首地址(或反向传送末地址)存入存入 DIDI 寄存器寄存器中中。(3) 数据串长度存入数据串长度存入 CXCX 寄存器寄存器。

(4) 建立方向标志建立方向标志

建立方向标志介绍两条指令:建立方向标志介绍两条指令:

· CLD ( clear direction flag )

功能: DF=0DF=0 ,执行串处理指令时 可以使地址自动自动 +1+1 或或 ++22 。

· STD ( set direction flag )

功能: DF=1DF=1 ,执行串处理指令时可以使地址自动自动 -1-1 或 或 -2-2 。。

Page 29: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

2. LODS(Load from string) 读串指令

读串指令有读串指令有 33种格式:种格式:

(1) LODS src; (字节) (AL) ((DS) : (SI)), (SI) (SI) ±1

(字 ) ( AX ) ((DS): ( SI)), ( SI ) (SI)±2

(2) LODS B (字节) ; ( AL ) ((DS): ( SI)) , (SI) (SI) ±1

(3) LODS W (字) ; ( AX ) ((DS): ( SI)), ( SI ) (SI)±2

功能:该指令把由(( SISI )指定的数据段中某单元内容)指定的数据段中某单元内容 (A(AL)L)

或 或 (A(AX)X) 中中。

DF=0 ,( SI )← ( SI ) +1 或 +2

DF=1 ,( SI ) ←( SI ) -1 或 -2

Page 30: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

LODSLODS 应用注意:应用注意:(1) 指令允许用段跨越前缀来指定非数据段的存储区。

(2) 该指令不影响条件码。

(3)一般说来,• 它不与 REP联用 ,每重复一次,累加器的内容就改变一次。

(AL) 中只能保持最后一个元素。• 有时缓冲区中的一串字符需要多次取出测试时可用本指令缓冲区中的一串字符需要多次取出测试时可用本指令。• 适用于在一个循环中,用基本串操作指令构成复杂串操作

时很有用。

Page 31: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

3 STOS3 STOS (( Store into stringStore into string ) 存入串指令) 存入串指令将将 (AL)(AL) 或(或( AX)AX) ( ((ES):(DI))(ES):(DI)) ,(,( DI) ±1DI) ±1 或或 ±2±2(DI)(DI)

存入串指令有存入串指令有 33种格式:种格式:

(1) STOS dest; (字节) ((ES) : (DI)) (AL) , (DI) (DI) ±1

(字 ) ((ES) : (DI)) (AX) , (DI) (DI) ±2

(2) STOS B (字节) ; ((ES) : (DI)) (AL) , (DI) (DI) ±1

(3) STOS W (字) ; ((ES) : (DI)) (AX) , (DI) (DI) ±2

用途:

与 REP联用时,( CX )←缓冲区长度。用来建立一串相同的值,初始清零。

Page 32: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

例:在附加段 STORE开始存 5 个空格

程序:

MOV AL , 20H ;‘ _’ ( AL )

MOV CX , 5

MOV DI , offset STORE

CLD

REP STOSB ; ((ES) : (DI)) (AL)

(DI) (DI)+1

20H

20H

20H

20H

20H

.. .

. . .

. . .

STORE:

Page 33: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

学习 LODS , STOS 指令应用

例:内存中有一个首地址为 BLOCK补码表示的有符号数的数据块补码表示的有符号数的数据块。

要求将正、负数分开,分别存于二个缓冲区要求将正、负数分开,分别存于二个缓冲区 ::

存放正数的缓冲区首址为 PUOS-DATA ,

存放负数的缓冲区首址为 MINUS-DATA 。

设: 源数据块用 SI 寻址,

正数的目的区用 DI 寻址,

负数的目的区用 BX 寻址。

循环次数 ( CX ) 。

Page 34: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

传送过程:传送过程:•用 LODS 指令把源数据取入( AL )中,• 检查其符号,确定正、负,

若为正数用 STOS 指令送至正数缓冲区,

若是负数,把( DI )与( BX )交换,仍使用 STOS 传送,

传送 完后再 将( DI )与( BX )交换,恢复原值。

Page 35: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

程序: START : MOV SI , OFFSET BLOCK ; 数缓串位置

MOV DI , OFFSET PUOS-DATA ; 正数缓冲区 MOV BX , OFFSET MINUS-DATA ;负

数缓冲区

MOV CX , COUNT

CLDCLD

GOON : LODSLODS

TEST AL , 80H

JNZ MINS ;若非 0 ,为负数转MINS

STOS BSTOS B ;正数 ,( DI )←( AL ),( DI )←( DI )+1

JMP AGAIN

MINS : XCHG BX , DI

STOSBSTOSB ;负数 ,( DI )←( AL ),( DI )←( DI ) +1 XCHG BX , DI

AGAIN : DEC CX

JNZ , GOON

HLT

Page 36: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

(二 ) 与 REPE/REPZ和 REPNE/REPNZ联合工作的 CMPS和 SCAS 指令

• REPE/REPZ 当相等 / 为零时重复串操作 格式: REPE (或 REPZ ) string primitive

当相等时的重复前缀 REPZ

String primitive 可用于 : CM PS , SCASCM PS , SCAS

1 、 CM PS ( Compare string ) 串比较指令

2 、 SCAS (Scan string ) 串扫描指令,搜索指令

Page 37: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

执行过程:(1) 当 (CX)= 0 , 结束 REPZ ,

执行 REPZ 下一条指令;

(2) 当 (CX)≠0 ,将 CX 的内容减 1 ,

执行 REPZ 后的串指令;

(3) 当 ZF = 1, 返回 (1) ;

(4) 当 ZF≠1, 则结束 REPZ

执行 REPZ 下一条指令。

注意:注意:◆ (CX)减 1 操作不影响标志

◆ ZF标志由串操作决定

◆ 当 (CX) = 0 或 ZF=0 时退出循环 REPZ 执行流程

(CX)=0?Y

(CX) (CX)-1

执行下一条指令

REZ执行 后的串指令

N

ZF=1?

N

Y

Page 38: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

• REPNE/REPNZ REPNE/REPNZ 当不相等当不相等 // 不为零时重复串操作不为零时重复串操作格式: REPNE (或 REPNZ ) string primitive

当不相等重复前缀 REPNZ

string primitiveString primitive 可为 : CM PS , SCASCM PS , SCAS

1 、 CM PS ( Compare string ) 串比较指令

2 、 SCAS (Scan string ) 串扫描指令,搜索指令

Page 39: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

执行过程:(1) 当 (CX )= 0 , 结束 REPNZ ,

执行 REPNZ 下一条指令。

(2) 当 (CX)≠0 ,将 CX 的内容减1 ,

• 执行 REPNZ 后的串指令。

( 3 ) 当 ZF = 0, 返回 (1) ;

当 ZF≠0, 则结束 REPNZ,

(4) 执行 REPNZ 下一条指令。

注意:◆ (CX) 减 1 操作不影响标志

◆ ZF 标志由串操作决定

◆ 当 (CX) = 0 或 ZF=1 时退出循环 REPNZ 执行流程

(CX)=0?Y

(CX) (CX)-1

执行下一条指令

RENZ执行 后的串指令

N

ZF=0?

N

Y

Page 40: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

11 、、 CMPSCMPS (( Compare string ) Compare string ) 串比较指令串比较指令 ( SI )—作为源串地址,( DI )—目的串地址

串比较指令串比较指令有有 33种格式:种格式:(1) CMPS dest , src ; ((ES) :(DI) - ( DS) : (SI)), 结果不存,置结果不存,置

标志标志

(2) CMPS B (字节) ;(SI) (SI)±1 , (DI)←(DI) ±1

(3) CMPS W (字); (SI) (SI)±2 , (DI) (DI)±2

执行操作:• ((ES) :(DI) - ( DS) : (SI)), 结果不存,置标志。

• 字节操作: (SI) (SI)±1 , (DI)←(DI) ±1

• 字操作: (SI) (SI)±2 , (DI) (DI)±2

注意:注意: 两数相减,只影响标志,不影响操作数。两数相减,只影响标志,不影响操作数。

其它操作规定与其它操作规定与 MOVSMOVS 同。同。

Page 41: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

学习 REPZ CMPSB 指令例:利用 CMPS 指令对 STRING1和 STRING2二个字符串进行 比较,比较结果相同在 RESULT 单元送 00H ,不同送0FFH 。

MOV SI , OFFSET STRING1

MOV DI , OFFSET STRING2

MOV CX , COUNT

CLD

REPZ CMPSB ;相等时继续比较

JNZ UNMAT ;若串不同,在 RESUL 单元中置 0FFH

MOV AL , 0 ;若串相等,在 RESULT 单元中置 00H

JMP OULPT

UNMAT : MOV AL , 0FFH

OUTPTOUTPT : : MOV RESULTMOV RESULT ,, ALAL

HLTHLT

Page 42: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

22 、、 SCASSCAS (Scan string ) 串扫描指令,搜索指令串扫描指令,搜索指令

( DI )—字符串起始地址,( AL) 或( AX ) — 关键字

串扫描指令有 3 种格式:格式: SCAS dest

SCASB (字节);( AL ) - (( ES ):( DI )),( DI )( DI ) ±1

SCASW (字);( AX ) - (( ES ):( DI )),( DI ) ( DI ) ±2

注意:注意: ( AL )或( AX ) - 目的串

两数相减,只影响标志,不影响操作数。

其它特性与 MOVS 同。

Page 43: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

REP NE SCASB 指令应用。例:要搜索的关键字 放在 (AL) 或 (AX) 中,搜索某一数据块或字符串中有无关 键字,若有,且记录关键字地址;若判断结果为 0 转出,表示找到关键字;若计数器为 0 ,表示没有要搜索的关键字。

MOV DI , 0FFSET BLOCK ;设置数据块地址指针 MOV CX , COUNT ;设置数据块长度

CLD

MOV AL , CHAR ; 关键字送入 AL 或 AX

REP NE SCASB ;( CX )≠ 0 , Z=0 继续 SCASB

JZ FOUND ; Z = 1 ,结果为 0 ,表示比较相等,找到关键字

JMP DONE ;此处是没有找到必须完成的工作。

。。。。。。

HLT

Page 44: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

应用举例:

例:一个数据块由大小写英文字母、数字、其他符号组成,用 CR ( ASCII 码 0DH) 结束。数据块首地址为 BLOCK

1 。

将其传送到 BLOCK2 为首地址的内存区,并将英文中小写英文字母 (a~z) 转换成大写英文字母 (A~Z), 其余不变。

分析:• 大小写英文字母中相应 ASCII 码的关系:

‘a’~’z’ 相应 ASCII 码为: 61H~7AH‘A’~’Z’ 相应 ASCII 码为: 41H~5AH

• 英文中小写英文字母 (a~z) 转换成大写英文字母 (A~Z) :只要将小写的 ASCII 码减去 20H 即可。

• 程序和流程图如下:

Page 45: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

程序 :LEA SI , BLOCK1LEA DI , BLOCK2CLD

NEXT: LODSBCMP AL , 0DH, 0DHJZ DONECMP AL , 61H61HJC OKCMP AL , 7BH7BHJNC OKSUB AL , 20HSUB AL , 20H

OK: STOSBSTOSBJMP NEXT

DONE: HLT

开始

初始化,置源地址、目的地址指针DF清方向标志

取一个字符

回车?

>' z'?

<‘ a'

转换为大写字母

送存

结束

Y

YN

N

Y

N

流程图

Page 46: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

小结:串操作指令重复前缀,操作数,地址指针小结:串操作指令重复前缀,操作数,地址指针

指令 重复前缀 操作数 地址指针寄存器

MOVS REP 源,目标 (DS): (SI) , (ES): (DI)

CMPS REPE/REPNE

源,目标 (DS): (SI) ,(ES): (DI)

SCAS REPE/REPNE

目标 (ES): (DI)

LODS 无 源 (DS): (SI)

STOS REP 目标 (ES): (DI)

Page 47: 课前复习指令系统: 1 .MOV  DS,2010H   ; 错     不能将立即数直接给段寄存器 2 .PUSH   AL       ; 错     不能对字节进行堆栈操作

作业: 1.继续上次作业 2.内存中有一个首地址为 BLOCK 单字节补码表示

的有符号数的数据块。 要求将正、负数分开,分别存于二个缓冲区 :

存放正数的缓冲区首址为 PUOS-DATA ,

存放负数的缓冲区首址为 MINUS-DATA 。

预习内容:复习控制转移指令和处理器控制指令