slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
汇编语言与接口技术 PowerPoint Presentation
Download Presentation
汇编语言与接口技术

Loading in 2 Seconds...

play fullscreen
1 / 171

汇编语言与接口技术 - PowerPoint PPT Presentation


  • 225 Views
  • Uploaded on

汇编语言与接口技术. 教师:范新民. 第三章: 8086 微处理器的指令系统. 第三章. 8086 微处理器的指令系统. 第三章: 8086 微处理器的指令系统. 教学要求 :. 本章重点介绍 8088/8086 指令系统中 7 种寻址方式和常用指令系统,此内容是 8088/8086 汇编语言编程的重点内容,它们对编程起着至关重要的作用。. 第三章: 8086 微处理器的指令系统. 本章主要内容:. 3.1 8086 的指令系统 3.2 汇编语言的基本语法 3.3 汇编语言程序设计基础. 第三章: 8086 微处理器的指令系统.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '汇编语言与接口技术' - ethel


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

汇编语言与接口技术

教师:范新民

slide2

第三章:8086微处理器的指令系统

第三章

8086微处理器的指令系统

slide3

第三章:8086微处理器的指令系统

教学要求:

本章重点介绍8088/8086指令系统中7种寻址方式和常用指令系统,此内容是8088/8086汇编语言编程的重点内容,它们对编程起着至关重要的作用。

slide4

第三章:8086微处理器的指令系统

本章主要内容:

3.1 8086 的指令系统

3.2 汇编语言的基本语法

3.3 汇编语言程序设计基础

slide5

第三章:8086微处理器的指令系统

3.1 8086的指令系统

3.1.1 8086 指令的寻址方式

3.1.2 8086 指令简析

slide6

第三章:8086微处理器的指令系统

3.1.0 概述

指令:控制计算机操作的基本命令形式

指令组成:有操作码 (OP)和操作数(OPRD )两部分

操作码 ——指示计算机要执行的操作;

操作数 ——指出在指令执行操作过程中所需要的

数据。

指令的一般格式:

slide7

第三章:8086微处理器的指令系统

8086指令中的操作数可以分为3种类型:

立即数操作数、寄存器操作数和存储器操作数。

  • 1、立即数操作数
    • 立即数是作为指令代码的一部分出现在指令中。
    • 通常作为源操作数使用。
    • 书写形式可以为二进制、八进制、十进制和十六进制数,也可以是一个可求出确定值的表达式。
slide8

操作数类型

  • 2、寄存器操作数
    • 操作数存放在寄存器中,用来参加运算或存放结果
    • 在双操作数指令中,它可以作为源操作数和目的操作数。其书写形式就是寄存器的名称。

目的操作数(OPD):为指令提供操作数据及操作结果的存放位置,它的值是随执行结果而变化的;

源操作数(OPS):只为指令提供操作数据,其值在指令执行过程中是不变的。

例 ADD AX,BX

slide9

操作数类型

  • 3.存储器操作数
    • 存储器操作数存放在存储器中,其存放的地址出现在指令中;
    • 其存放的地址应该是物理地址,但在指令中给出的是逻辑地址,段地址是隐含的,一般采用偏移地址EA(或称有效地址)来表示;
    • 书写形式:假如偏移地址是X,该地址中的内容为Y,则(X)=Y
slide10

8086的指令系统

3.1.1 8086 指令的寻址方式

  • 寻址:指令执行时寻找操作数地址的过程;
  • 寻址方式:寻找操作数存放地址的各种方式;
  • 一般情况下,指令中并不直接给出操作数的数值,而是给出操作数存放的地址——寄存器的地址或存储单元的地址。
  • 在许多情况下,操作数的地址也不直接给出,而是给出计算操作数地址的方法。计算机执行程序时,根据指令给出的寻址方式,计算出操作数的地址,然后从该地址中取出操作数进行指令操作码指定的操作,把操作结果送入指定的目的操作数中。
slide11
8086 指令的寻址方式:

8086 指令的寻址方式

立即寻址、寄存器寻址、存储器寻址、串操作寻址、外设I/O 端口寻址以及程序转移操作寻址。

存储器寻址:

直接寻址、寄存器寻址、间接寻址、基址寻址、变址寻址、基址变址寻址。

注意:根据寻址方式计算而得的地址只是有效地址EA

(段内偏移地址),这一地址还需与所在段的段

基值组合后才能形成20位的物理地址。

slide12

操作数据的寻址方式

  • 立即寻址

操作数直接放在指令中,即操作数的存放地址就是指令操作码的下一单元的地址,其内容为操作数n。

  • 操作数n称为立即操作数可以是8位或16位二进制补码表示的常数,若是16位,则高位字节存放在高地址单元中,低位字节存放在低地址单元中。
slide13

操作数据的寻址方式

例:MOV AX,1234H

  • 该方式不能用在单操作数指令中,不能用于目的操作数字段,只能用于源操作数字段。
slide14

操作数据的寻址方式

  • 立即数可用二进制、十进制、十六进制表示,也可以使用单引号括起来的ASCII码表达的字符和字符串。

例: MOV AX,‘AB’

目的操作数地址是AX;

源操作数‘AB’紧跟着指令操作符存放在代码段中。

该指令的功能是将高地址单元中的字母A的ASCII码送 入AH中、低地址单元中的字母B的ASCII码送入AL中。

  • 由于立即数是直接从指令中取得的,所以取数速度较快,这种寻址方式常用来给寄存器或存储器赋初值。
slide15

操作数据的寻址方式

  • 寄存器寻址
    • 指令所需操作数存放在指令指定的寄存器中。
    • 16位操作数时,寄存器可以是:AX、BX、CX、DX、SI、 DI、SP、CS、DS、ES、SS和BP ;
    • 8位操作数时,寄存器可以是:AL、AH、BL、BH、CL、CH、DL和DH。
  • 特点:寻址方式速度较快。适用于需要经常存取的操作数

例:MOV AX,BX 把BX的内容传送到AX

slide16

操作数据的寻址方式

  • 注意:
  • 当指令中的源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错;
  • 两个操作数不能同时为段寄存器;
  • 目的操作数不能使代码段寄存器。

例:MOV CS,AX

汇编时没有出错,可得机器码为8EC8H,但执行时会发生问题。

slide17
存储器寻址

操作数据的寻址方式

操作数在存储器中,CPU要访问存储器操作数,需先计算出操作数的物理地址PA。

  • 物理地址(PA)= 段基址X10H + 有效地址(EA)
  • 段基址由段寄存器的值左移4位所表示
  • 有效地址EA由基址寄存器(BX、BP)、变址寄存器(SI、DI)以及指令给出的8位或16位的偏移量中的1个、2个或3个组合而成。
  • 根据有效地址给出的方式不同,组成各种不同的寻址方式。
slide18

存储器寻址

  • 直接寻址

指令操作数字段中存放的是操作数的16位偏移地址EA,即操作数的偏移地址EA与操作码一起存放在代码段中,存放于指令操作码下一字单元中。

  • 操作数的物理地址由其所在段的寄存器内容左移4位与指令中给出的偏移地址EA相加形成。如图所示。
slide19

42000H

存储器寻址

  • EA可以用符号或数值表示,如果EA为数值,则必须用方括号括起来,如果EA用符号表示,则方括号可用可不用。
  • 例:MOV AL, [2000H]
    • 若DS=4000H,则此指令将数据段中物理地址为42000H 单元的内容传送AL寄存器。
slide20

存储器寻址

  • 操作数可以存放在数据段,也可以存放在其它段,如果放在其它段里,方括号前应给出段寄存器名。
  • 例: (1) MOV AX,ES:[2005H]
  • (2) MOV DH,ES:[2005H]
  • 执行前:AX=1,ES=3000H ,(32005H)=10H
  • (32006H)=20H。
  • 执行后:ES、(32005H)字节单元内容未变。
  • (1)源操作数为16位的字数据,AX=2010H。
    • (2)源操作数为8位的字节数据,DH=10H。
slide21

存储器寻址

例:MOV AX,BUFA

若BUFA在数据段定义,其偏移地址是1000H,即 BUFA =1000H。

执行前:DS=2000H,AX=222H ,(21000H)=1234H

源操作数采用直接寻址方式, 变量BUFA的偏移地址EA存放于指令操作码下一单元中。

指令的功能是将字类型变量BUFA中的内容送入AX之中。

执行后:AX=1234H。

slide22

存储器寻址

  • 寄存器间接寻址
  • ◆ 操作数的偏移地址EA在指令指定的寄存器中,即寄存器R的内容为操作数的偏移地址EA,而操作数存放在存储器中。

◆ 操作数物理地址PA的形成:

PA= 段寄存器×16+ EA

= 段寄存器×10H+ R

◆ 可作间接寻址的寄存器只能

是:SI、DI、BP、BX;

slide23

存储器寻址

◆段寄存器的选择

若指令中指定的寄存器是BX、DI或 SI,则操作数在当前数据段中,操作数的物理地址为:

BX

PA=DS ×10H +SI

DI

若指令中指定的寄存器是BP,则操作数在当前堆栈段中,操作数的物理地址为:

PA= SS×10H +BP

◆ 寄存器的间接寻址方式可以用于表格处理,执行完一条指令后,只需修改寄存器内容就可取出表格中的下一项,所以,通常将它们称作地址指示器,用于存取存储器数据。

slide24

存储器寻址

例:MOV  AX,[BX]

指令执行后:

AX=3425H

slide25

存储器寻址

例:MOV AX,[BP]

执行前:AX=0,BP=50H,SS=2000H,20050H=1A34H

目的操作数地址是AX ;

源操作数[BP]表示使用寄存器间接寻址,BP的内容为源操作数的偏移地址EA;

源操作数的物理地址:

PA=SS ×10H +BP

执行后:

AX=1A34H,BP、SS、(20050H)内容未变。

based addressing
基址寻址(Based Addressing)

存储器寻址

操作数的有效地址(EA)是一个基址寄存器(BX/BP)的内容和指令中指定的8位或16位偏移地址之和。

可表示为:

 [BX/BP+D]或 D[BX/BP]  其中:D为变量或常量

 例:MOV AX,COUNT[BX] 或 MOV AX,[BX+COUNT]

INC BYTE PTR[BP+4]

  • BP作基址寻址时,默认为SS段内寻址;BX作基址时,默认为DS段内寻址。
  • 若D为常量,则以有符号的二进制数表示,可为8位或16位值。
  • 当D为8位值时,有效地址计算中,位移量必须进行符号扩展
indexedaddressing
变址寻址(IndexedAddressing)

存储器寻址

指令中给出一个位移量D 作为基准地址,再同变址寄存器SI(或DI)的内容相加作为存储器操作数的有效地址。

可表示为:

[SI/DI+D]或 D[SI/DI] 其中:D为变量或常量

例:MOV AX,COUNT[SI] 或 MOV AX,[SI+COUNT]

以变址寄存器SI/DI寻址,默认为DS段内寻址

基址寻址和变址寻址又称为寄存器相对寻址。

slide28

D

存储器寻址

PA= 段寄存器×16+R+D

其中:

D为8位或16位的位移量,R为基址寄存器或变址寄存器

slide29
寄存器相对寻址

例:MOV   AL,[BX+5]

slide30

BP

SS

第二章:微处理器的指令系统

例:MOV AX,NAME[BP]

执行前:AX=0,BP=1000H,SS=2000H

( 21100H)=1234H,NAME=100H

源操作数的物理地址:

PA=SS ×16 +BP+ NAME = 21100H

执行后:

AX=1234H,BP、SS、 (20010H)内容未变。

slide31

存储器寻址

  • 基址变址寻址
  • 操作数在存储器中,操作数的偏移地址EA是一个基址寄存器和一个变址寄存器之和。

基址寄存器为BX和BP,变址寄存器有 SI 、DI。

操作数的偏移地址EA

BX + SI /DI

EA=

BP + SI/DI

PA= 段寄存器×16+ BR+ IR

slide32

存储器寻址

例:MOVAX,[BX][SI] 或 MOVAX,[BX+SI]

设:(DS)=5000H

(BX)=2000H

(SI)=0006H

有效地址EA=2000H+0006H

=2006H

物理地址=5000H×10H+

2006H=52006H

执行结果:AX=0AB78H

slide33
4、程序转移寻址

程序转移寻址

  • 当程序在本段内发生转移时,需要给出即将转移去执行的那条指令的偏移地址,并用它去取代IP中的原有内容。
  • 如果即将转移去执行的指令与原来执行的指令不在同一段中,则还需用新的代码段的段基值去取代CS中的原有内容,此时,操作数作为转移地址使用,分别送到IP和CS。
  • 程序转移寻址方式用于:条件转移指令、无条件转移指令、循环指令和转子指令(调用指令)。
slide34
相对寻址

程序转移寻址

  • 以IP 的内容为基准地址,加上紧跟指令操作码后的相对位移量D ,得到转移地址的偏移地址;
  • 转移地址的偏移地址为IP+D,D是带符号的二进制数。当D为8位数时,转移范围:-128~+127;

当D为16位数时,转移范围:-32768~+32767。

  • 这种寻址方式又称为段内直接转移。

例: JMP ADDR

ADDR为转移地址的标号。

slide35
段内寄存器寻址

程序转移寻址

以寄存器的内容为转移地址的偏移地址。

例: JMP BX ;BX中的内容即偏移地址。

  • 段内间接转移寻址
  • 包括存储器操作数中的寄存器间接寻址、变址寻址、基址寻址以及基址变址寻址等几种寻址方式,这些寻址方式求得的操作数即为转移地址的偏移地址。

JMP WORD PTR [BX] ,

JMP VAR [BX][SI] ,

JMP WORD PTR [EA](EA 为有效地址)。

slide36

JMP

偏移地址

IP

段基址

CS

.

.

.

.

程序块

段间直接转移寻址

程序转移寻址

  • 程序从一个代码段转移到另一个代码段称为段间转移,实现段间转移不仅要求改变IP中的指令偏移地址,还要改变CS中的段基值。
  • 转移指令中带有两个16位地址:

第一个为转移偏移地址

第二个为转移的段基值

slide37
要实现段间转移需要两个16位地址,可以用任何数据存储器的间接寻址方式求得。要实现段间转移需要两个16位地址,可以用任何数据存储器的间接寻址方式求得。段间间接转移寻址

程序转移寻址

  • 汇编指令形式为:
    • JMP DWORD PTR [EA]
slide38

操作数据的寻址方式

5、跨段的有关问题

指令中若不标明段寄存器,就表示操作数在默认存储段中。

  • 直接寻址方式的操作数默认在数据段(DS);
  • 寄存器BP作间址寄存器、或基址寄存器时,操作数默认在堆栈段(SS);
  • 寄存器BX、SI、DI作间址寄存器、变址寄存器或基址寄存器时,操作数默认在数据段(DS);
  • 否定默认状态,必须采用跨段前缀指明操作数所在段的段寄存器名。
slide39

操作数据的寻址方式

  • 跨段前缀的说明:
  • ;DS左移4位+BP
  • ;ES左移4位+ BX
  • ;SS左移4位+ SI
  • ;SS左移4位+ DI
  • 例 :
  • MOV AX,DS:[BP]
  • MOV BX,ES:[BX]
  • MOV CX,SS:[SI]
  • MOV DX,SS:[DI]
slide40

8086微处理器的指令系统

3.2 指令简析

8086指令系统有92种基本指令。按功能可分为6大类:

  • 数据传送类指令
  • 算术运算类指令
  • 逻辑运算和移位类指令
  • 串操作类指令
  • 控制转移类指令
  • 处理器控制类指令
slide41
一、数据传送指令 (共14条)

8086微处理器的指令系统

slide42

数据传送指令

  • 通用数据传送指令 MOV

格式:MOV dest,src (B/W)

  • 功能:将源操作数送至目的地址中,即dest→src。

MOV指令可以在CPU内或CPU和存储器之间传送字或字节。

传送的信息可以有如下7种形式:

(1) 寄存器到寄存器:

MOV AX,BX ;将BX的内容送到AX中。

(2) 立即数到寄存器

MOV AX,03H ;将立即数03H送到AX中。

slide43

数据传送指令

(3) 立即数到存储单元:必须用PTR确定操作数类型

MOV BYTE PTR [2000H],12H

功能:将立即数12H送到 (2000H)中。

(4) 存储单元到寄存器

MOV AX,Y[BP][SI]

功能:将地址为(SS) ×16+(BP)+(SI)+位移量Y的存

储单元的内容送到AX中。

(5) 寄存器到存储单元

MOV TABLE,AX

功能:将寄存器AX中的内容送到TABLE存储单元中。

slide44

数据传送指令

(6) 寄存器或存储单元到除CS外的段寄存器

MOV DS,DATA

功能:将DATA的内容送到DS中。

(7) 段寄存器到寄存器或存储单元

MOV AX,DS

功能:将段寄存器的内容送到AX中。

slide45

数据传送指令

  • 使用MOV指令时要注意以下一些问题:
    • 不允许在两个存储单元之间直接传送数据。
    • 不允许在两个段寄存器之间直接传送数据。
    • 不允许用立即数直接为段寄存器赋值。
    • 不影响标志位。
    • 段寄存器CS及立即数不能作为目标操作数;
    • 传送数据的类型必须匹配;
slide46

数据传送指令

  • 堆栈操作指令
    • 堆栈是内存中的一个特殊存储区(RAM区),用于数据的保存;
    • 堆栈中的数据只能通过堆栈的一端进行存取,这一端称为“栈顶”;
    • 堆栈数据总是通过栈顶进行存取,栈顶指针用SP寄存器表示;
    • 堆栈操作的原则为“先进后出”或“后进先出”;
    • 堆栈操作必须以“字”为单位进行;
    • 堆栈中的数据在堆栈段中从地址高端向低端存放,称为向下生长型。
slide47

数据传送指令

  • 入栈指令 PUSH (W)
  • 格式:PUSH SRC
  • 执行的操作:(SRC)→(SP-1)(SP-2),SP-2→SP
  • 功能:将寄存器、段寄存器或存储器中的一个字数据压入
  • 堆栈中。
slide48

SS→

AX

SS→

04

F8

0FFEH

0FFFH

1000H

F8

04

0FFEH

0FFFH

1000H

XX

XX

数据传送指令

例:PUSH AX

执行前:

AX = 04F8H,SP =1000H

执行后:

( 0FFEH)=04F8H,AX的 内容不变,SP=0FFEH

SP→

SP→

slide49

SS→

SS→

AX

04

F8

SP→

SP→

F8

F8

0FFEH

0FFFH

1000H

0FFEH

0FFFH

1000H

04

04

XX

XX

数据传送指令

  • 出栈指令 POP (W)
  • 格式:POP dest
  • 执行的操作: dest ← (SP+1 , SP ), SP ← SP +2
  • 功能:将堆栈栈顶内容弹入寄存器、段寄存器或存储器中

例:POP AX

执行前:AX=1111H

执行后:AX=04F8H

SP→

slide50

数据传送指令

  • 几点说明:
    • PUSH指令的操作数不能是“立即数”,POP指令的操作数不能是段寄存器CS。
    • PUSH和POP指令都不影响标志位。
    • 堆栈操作中,当多个数据暂存时,PUSH进入数据的顺序与POP弹出的顺序应相反。

例:依次用堆栈保存AX、BX、CX、DX寄存器的内容,然后再

将它们复原。

  • PUSH AX
  • PUSH BX
  • PUSH CX
  • PUSH DX
  • POP DX
  • POP CX
  • POP BX
  • POP AX
slide51

第二章:微处理器的指令系统

  • 交换指令与换码指令
    • 交换指令 XCHG
  • 格式: XCHG dest,src (B/W)
  • 执行的操作: OPS OPD
  • 功能:将两个操作数的内容互换
  • 可在累加器、通用寄存器或存储器之间相互交换,两个存储器间不能直接交换,也不允许使用段寄存器。
  • 执行结果不影响标志位。
slide52

例: XCHG AX,[2000H]

执行前: AX=01F0H、DS=F000H、(F2000H)=4AB7H

功能为交换AX寄存器和F2000H地址单元的内容;

执行后:AX=4AB7H、(F2000H)=01F0H。

例:写出使两个内存单元NUM1和NUM2的内容互换的指令

于XCHG指令不允许同时对两个存储单元进行操作,必须借助于一个通用寄存器AX。

程序为:MOV AX , NUM1

XCHG AX , NUM2

MOV NUM1 , AX

slide53

数据传送指令

  • 换码指令 XLAT
  • 格式:XLAT或 XLAT变量名或表格首地址
  • 执行的操作:AL DS:( BX+AL )
  • 功能:将BX寄存器内容加上AL寄存器内容作为操作数的
  • 偏移地址,从数据段中这个地址取一字节内容送
  • AL中。作用是将一种代码转换成另一种代码。

XLAT指令所需的数据表格是预先建立的,当进行代码转换时,应先将表格的首地址存入BX寄存器,并把需要转换的代码(即相对于首地址的偏移值)存入AL寄存器

slide54

数据传送指令

该指令的执行结果不影响标志位。

AL寄存器只有8位,所以表格长度不能超过256个字节。

例:用查表法将10进制数转换成相应的ASCII码。

解:在数据段中定义一个10进制的ASCII码表,设表的名称为ABC,内容为30H、31H、32H、33H、34H、35H、36H、37H、38、39H。

程序段为:LEA BX, ABC

MOV AL,5

XLAT

slide55

数据传送指令

  • 地址传送指令
    • 有效地址送寄存器指令 LEA
  • 格式:LEA reg,src
  • 功能:把源操作数的偏移地址送到指定的寄存器中
      • reg可以为任一16位通用寄存器。
      • src为各种寻址方式的存储器操作数,可以是变量名、标号或地址表达式。
  • 例 LEA AX,TABLE ;TABLE为标号
  • LEA CX,[BX+SI]
  • LEA DX,NUM[SI+BX] ;NUM为变量
      • LEA指令取的是变量的偏移地址,而不是变量的值。
slide56

数据传送指令

  • 数据段指针送寄存器指令 LDS
  • 格式:LDS reg,src
  • 功能:把源操作数src指定的内存中低地址的两个单元的内
  • 容送到由指令指定的通用寄存器中,高地址两个单元
  • 的内容送到DS段寄存器。
  • reg可以为任一16位通用寄存器BX,BP,SI,SI等。
  • src为各种寻址方式的存储器操作数。
slide57

0C200H

数据传送指令

例:LDS SI,[BX]

指令执行前:DS=0C00H、BX=0200H、

(0C200H)=2A35H、 (C202H)=4000H。

存储器单元的物理地址 PA=0C200H

指令执行后:

DS=4000H

SI=2A35H

slide58

数据传送指令

  • 附加段指针送寄存器 LES
  • 格式:LES reg,src
  • 功能:src指定的内存中低地址的两个单元的内容送到由
  • 指令指定的通用寄存器中,高地址两个单元的内容
  • 送到ES段寄存器中。

例: LES DI,[BX]

执行前:DS=B000H、BX=0020H

(B0020H)=0076H、(B0022H)=1F00H

执行后:ES=1F00H、DI=0076H

slide59

数据传送指令

  • 标志寄存器传送指令
  • (1)标志寄存器送AH指令LAHF
  • 格式:LAHF
  • 功能:将标志寄存器FR低八位 送到AH中。

(2)AH 送标志寄存器指令SAHF

格式:SAHF

功能:将AH的内容送到标志寄存器FR的低8位中。

slide60

数据传送指令

(3) 标志寄存器入栈指令 PUSHF

格式:PUSHF

功能:将标志寄存器FR的内容压入堆栈。

(4)标志出栈指令 POPF

格式:POPF。

功能:将栈顶内容弹出送入标志寄存器中。

  • 标志寄存器传送指令的特点
    • LAHF、PUSHF不影响标志位;SAHF、POPF影响标志位,由装入的值确定标志位的值。
    • PUSHF、POPF用于保护调用过程前(PSW),过程返回后恢复。
slide61

数据传送指令

  • 输入/输出数据传送指令
  • 只能使用累加器AX或AL与外部设备的端口传送信息。
  • 两大类: 直接输入输出指令,端口地址在00H~FFH
  • 间接输入输出指令,端口地址>FFH→DX
  • (1)输入指令:IN
  • 格式:IN Acc,Port;Acc累加器,Port:外设端口地址
  • 功能:将数据从输入端口传送到累加器
  • 四种格式:
  • IN AL,PORT ;B AL←(PORT)
  • IN AX,PORT ;W AX←(PORT+1)(PORT)
  • IN AL,DX ;B 当PORT>FFH时,将端口地址先送DX
  • IN AX,DX ;W 同上
slide62

数据传送指令

(2)输出指令:OUT

格式:OUT PORT,Acc;同IN

功能:将数据从累加器传送到输出端口中。

四种格式:

OUT PORT,AL ;B

OUT PORT,AX ;W

OUT DX,AL ;B

OUT DX,AX ;W

例:① IN AL,20H ;AL←(20H)

② MOV DX,300H

IN AX,DX ;AX←(300H)(301H)

slide64

算术运算指令

  • 加法指令

(1)不带进位的加法指令 ADD

格式: ADD dest,src

功能:完成源操作数和目的操作数的加法运算,和送目

的单元执行的操作: dest dest + src

几点说明:

dest和src可同为8位或16位的操作数;

目的和源操作数不能同时为存储器操作数、段寄存器

slide65

算术运算指令

标志位的影响:

OF标志:

当8位带符号数相加, 和超出范围(-128~+127)或16位带符数相加,和超出范围(-32768~+32767)时,置OF=1;否则OF =0 ;

CF标志:

当8位数相加或16位数相加,最高位有进位时,置 CF=1;否则CF =0 ;

状态标志SF,AF,PF,ZF:根据运算结果设置。

slide66

算术运算指令

例:ADD BX,0F0F0H;

若执行前BX=1234H,写出执行后结果和各状态标志。

0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0

1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0

10 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0

+

执行后:

BX =0324H, CF=1,SF=0,ZF=0,OF=0,PF=1

AF=0

slide67

算术运算指令

例: MOV AL,7EH ; AL =7EH

MOV BL,5BH ; BL =5BH

ADD AL,BL ; AL =7EH+5BH=D9H

对标志的影响:

SF=1 , 结果最高位=1

ZF=0 ,结果不等于0

AF=1 ,D3位向D4 有进位

PF=0 ,”1”的个数为奇数

CF=0 ,无进位

OF=1 ,和超过+127

slide68

算术运算指令

(2)带进位加法指令ADC

格式: ADC OPD,OPS

功能 :完成源操作数、目的操作数和进位标志CF的加法

运算,和送目的单元。

执行的操作: OPD OPD + OPS+ CF

指令的特征、用法和对标志位的影响和ADD指令相同

主要用于多字节运算中。低位数相加用ADD指令,高 位数相加用ADC指令,CF 值为低位相加时产生的进位;

slide69

算术运算指令

例:在寄存器DX、AX和CX 、BX中分别存放32位数,写出

计算两数之和的指令 。

若执行前:

DX=0067H, AX=F000H,CX=0001H, BX=2345H

指令序列: ADD AX, BX

ADC DX, CX

执行第一条指令ADD AX,BX 后:

AX=1345H,CF=1,ZF=0,

SF=0,OF=0,PF=0

1 1110000 00000000

+ 0 0100011 01000101

10 0010011 01000101

slide70

算术运算指令

执行第二条指令 ADC DX,CX后:

DX=0069H,CF=0,ZF=0,

SF=0,OF=0,PF=1

0 0000000 01100111

0 0000000 00000001

+ 1

0 0000000 01101001

两数之和为:0069 1345 H

slide71

算术运算指令

例:在以DATA1和DATA2为首址的存储器单元中分别存放2个32位数,写出计算两数之和并将结果存放于DATA3为首址的内存单元中的指令序列 。

若执行前,数据存放如图所示。

完成加法: 74AC60F8H + D59E36C1H

程序为:

MOV AX,DATA1

ADD AX,DATA2 ; AX +(DATA2)→AX

MOV DATA3,AX

MOV AX,DATA1+2

ADC AX,DATA2+2 ; AX +(DATA2+2)+CF→AX

MOV DATA3+2,AX

slide72

算术运算指令

(3)加1指令INC

  • 格式: INC dest
  • 执行的操作:dest dest +1
  • 功能:指定的操作数加1

dest可为8位或16位的操作数,可以是寄存器、存储器。不能是段寄存器。

标志位的影响:影响SF、ZF、AF、PF、OF,不影响CF。

用于在循环程序中修改地址指针和循环次数。

slide73

算术运算指令

例:INC AL ;8位寄存器AL的内容加1

INC CX ;16位寄存器CX的内容加1

INC [SI] ;存储器 单元内容加1

BYTE PTR字节

INC [SI] ;存储器 单元内容加1

WORD PTR 字

slide74

算术运算指令

  • (4)BCD码加法调整指令 AAA
  • BCD码的加法
  • 被加数、加数用BCD码表示,做加法时按二进制加法规则进行, 要求相加后的和也为BCD码表示的数。

BCD码加法完成:

35 +42 28+36

( 0 0 1 0 1 0 0 0)BCD

+ ( 0 0 1 1 0 1 1 0 ) BCD

0 1 0 1 1 1 1 0 非法码

+ 1 1 0

( 0 1 1 0 0 1 0 0 ) BCD = 64

(0 0 1 1 0 1 0 1) BCD

+(0 1 0 0 0 0 1 0 ) BCD

( 0 1 1 1 0 1 1 1 )BCD =77

slide75

算术运算指令

  • 非压缩BCD码加法调整指令 AAA
    • 格式:AAA
    • 功能:对AL中两个非压缩BCD码数相加的和进行调整
    • 执行的操作:
    • 若:AL&0FH > 9 或 AF=1
    • 则: AL ← AL+6 、AL ← AL ∧0FH、AH ← AH+1
  • AF ← 1 、CF ← AF
  • AAA 必须紧跟在加法指令ADD 或ADC后
  • 影响标志位AF、CF ,标志位OF PF SF ZF 为不定值
slide76

例:设AX的内容为 05H,BL寄存器的内容为09H

  • 执行指令:
  • ADD AL,BL
  • AAA
  • AHAL
  • 0000 0101
  • + 0000 1001
  • 0000 1110
  • 0000 0000
  • + 0000 0001
  • 0000 0001
  • + 0000 0110
  • 0001 0100

AL ∧0FH=00000100

指令执行后:

AX寄存器的内容是0104H。

slide77

算术运算指令

  • 压缩BCD码加法调整指令DAA

格式 :DAA

功能: 对AL中的两个压缩BCD码数相加的和进行调整:

执行的操作:

若:AL&0FH > 9 或 AF=1 则: AL← AL+6 、AF ←1

  • 若:AL&F0 ≥A0H 或 CF=1 则: AL← AL+60H、CF ←1

DAA必须紧跟在加法指令ADD 或ADC后

影响标志位AF、CF、 PF、 SF 、ZF ,标志位 OF为任意值。

slide78

算术运算指令

  • 减法指令
  • (1)不带借位的减法指令SUB
    • 格式:SUB dest,src
    • 执行的操作:dest ← dest-src
    • dest可为寄存器、存储器。但不能同为存储器, 不能为段寄存器。
    • 标志位的影响
  • OF标志:8位数或16位数运算结果超出范围(-128~+127)
  • 或(-32768~+32767)时,置OF =1;否则置OF=0
  • CF标志:CF为借位标志;当8位数或16位数相减时,最高位有
  • 借位时,置 CF=1;否则置CF=0 ;
  • 状态标志SF,AF,PF,ZF:根据运算结果设置。
slide79

算术运算指令

  • (2) 带借位减法指令SBB
    • 格式:SBB dest,src (B/W)
    • 功能:从目的操作数中减去源操作数和标志位CF,结果
    • 送入目的地址中;
    • 执行的操作:(dest)←(dest)-(src)-CF
    • 指令的特征、用法和对标志位的影响和SUB指令相同;
    • 主要用于多字节减法运算中,低位数相减用SUB指令,高位数相减用SBB指令,CF 值为低位相减时产生的借位;
slide80

算术运算指令

例:求两个三字节数之差,差存放在DL、AH、AL中。

A1 DB 105,36,59

A2 DB 120,64,72

… … ……

MOV AL,A1

SUB AL,A2 ;低字节数之差

MOV AH,A1+1

SBB AH,A2+1 ; 中间字节数之差

MOV DL,A1+2

SBB DL,A2+2 ; 高字节数之差

slide81

算术运算指令

  • (3) 减1指令 DEC
    • 格式:DEC dest (B/W)
    • 执行的操作: dest ← dest -1
    • 功能:目的操作数减1,结果送回目的地址中;
    • 指令的特征、用法和对标志位的影响和INC指令相同
    • 用于在循环程序中修改地址指针和循环次数。
  • (4) 比较指令 CMP
    • 格式:CMP dest,src (B/W)
    • 执行的操作: OPD - OPS
    • 功能:两个操作数相减,但结果不回送,结果只影响状态标志位,根据比较的结果使程序产生分支;
slide82

算术运算指令

  • 指令的特征、用法和对标志位的影响和SUB指令相同
  • 利用标志位比较两个数之间的关系:
    • 根据ZF标志,判断两者是否相等: ZF=1 , 则两数相等
    • 根据CF标志, 判断两个无符号数的大小;
    • 用SF、OF标志,判断二个带符号数的大小:
    • SFOF=0 , 则 DEST≥SRC
  • SFOF=1 , 则 DEST<SRC

10-5=5 SF=0 OF=0, A>B

不发生溢出时:OF=0-10-(-5)=-5 SF=1 OF=0, A <B

-10-5=-15 SF=1 OF=0, A <B

slide83

算术运算指令

发生溢出时:OF=1

如A=126,B=-48,则有:

A-B=126-(-48)=174 溢出 01111110

+ 00110000

10101110 SF=1,OF=1 A>B

如A=-48,B=126,则有:

A-B=-48-126=-174 溢出 11010000

+ 10000010

101010010 SF=0,OF=1 A<B

SFOF=0, 则 DEST≥SRC

SFOF=1 , 则 DEST<SRC

slide84

算术运算指令

  • (5) 求补指令 NEG
    • 格式:NEG dest (B/W)
    • 执行的操作:(dest) 0 -(dest)
    • 功能:操作数按位求反后末位+1
    • dest可以是寄存器、存储器操作数;
    • 影响标志AF、CF、OF、PF、SF、ZF
    • 当操作数为0时,求补运算的结果使CF=0;其他情况CF均为1;
    • 对―128求补或对―32768求补时使OF=1,其他情况OF均为0。
slide85

算术运算指令

例:设BX内容为0006H,DS内容为1800H,存储单元

18006H的内容为47H,执行NEG [BX]。

物理地址 PA=1800X10H+0006=18006H

(18006H)= 47H = 0100 0111

求补:00000000-01000111=1011 1001 = B9H

置标志位:SF=1、 ZF=0、 AF=1、 PF=0,

OF=0,CF=1。

slide86

算术运算指令

(6)非压缩BCD码减法调整指令 AAS

格式 :AAS

功能:对AL中的两个非压缩BCD码数相减的差进行调整

AAS 必须紧跟在减法指令SUB、SBB后。

(7) 压缩BCD码减法调整指令 DAS

格式: DAS

功能:对AL中的两个压缩BCD码数相减的差进行调整

DAS 必须紧跟在减法指令SUB、SBB后 。

slide87

算术运算指令

  • 加、减法指令的应用:
    • ADD AL,50H
    • ADD DI,SI
    • ADD AX,[DI]
    • INC AL
    • INC AX
    • SUB AX,BX
    • SBB DX,CX
    • DEC CX
    • DEC BYTE PTR[SI]
    • CMP AL,0
    • ;AL+50H→AL
    • ;DI+SI→DI
    • ;AX+([DI+1],[DI])→AX
    • ;AL+1→AL
    • ;AX+1→AX
    • ;AX-BX→AX
    • ;DX-CX-CF→DX
    • ;CX-1→CX
  • ;SI所指示字节单元内容减1送回
  • ;AL和0进行比较,置标志位
slide88

算术运算指令

    • 乘法指令
  • (1)无符号数乘法指令MUL
  • 格式:MUL src(B/W)
  • 功能:实现无符号数src与累加器AL(AX)中的无符号数
  • 相乘。
  • 执行操作:字节乘法操作:AX←AL×src
  • 字乘法操作: DX,AX←AX × src
  • src可以是寄存器、存储器操作数;
  • 目的操作数(被乘数)隐含 。
slide89

算术运算指令

影响标志: 乘积高半部分为0, CF=OF=0

乘积高半部分不为0, CF=OF=1

其它标志SF、ZF、AF、PF为不定值

例: MUL WORD PTR BETA[BX]

MUL DI

例: 完成两个无符号数09H与10H相乘

MOV AL,09H ;09H →AL

MOV BL,10H ;10H →BL

MUL BL ;(09H)*(10H) →AX(0090H)

slide90

算术运算指令

  • (2)带符号数乘法指令 IMUL
    • 格式:IMUL src
    • 指令操作、特征、使用和标志位影响均与指令MUL相同,只是乘数、被乘数和乘积都是带符号数即以补码表示的数 。
  • (3) 非压缩BCD码乘法调整指令 AAM
    • 格式 : AAM
    • 功能:对AX中的两个非压缩BCD码数相乘的积进行调整
  • AAM 必须紧跟在乘法指令后
slide91

算术运算指令

例:设AL=9CH,BL=12H,分析执行无符号数乘法指令 MUL BL和有符号数乘法指令IMUL BL。

(1) 数据作为无符号数时, 使用MUL指令

AL= 9 CH的十进制数为 156 D

BL= 12 H的十进制数为 18 D

其结果为:AX= AF8 H= 2808 D,CF=OF=1。

(2) 数据作为有符号数时,使用IMUL指令

AL= 9 CH的十进制数为(-100)D

BL= 12 H的十进制数为(18)D

其结果为:AX=(F8F8)H=(-1800)D,CF=OF=1。

slide92

算术运算指令

    • 除法指令
    • (1) 无符号数除法指令 DIV
    • 格式:DIV src (B/W)
    • 功能:实现两个无符号二进制数除法运算,除数为src,
    • 字节相除,被除数在AX中;字相除,被除数在
    • DX、AX中。
    • 执行操作:
    • 字节除法:AL←AX/(OPS)的商,AH←AX/(OPS)的余数
  • 字操作:AX←(DX,AX)/(OPS)的商
  • DX←(DX,AX)/(OPS)的余数
slide93

算术运算指令

  • src可以是寄存器、存储器操作数;目的操作数(被除数)隐含 ;
  • 标志位为不定值

例: DIV BL ;(AX)/(BL) 商→AL,余数→AH

DIV CX ;(DX),(AX)/(CX) 商→AX,余数→DX

slide94

算术运算指令

  • (2) 有符号数除法指令 IDIV
    • 格式:IDIV src
    • 功能:实现带符号数的除法;
    • 指令操作、特征、使用和标志位影响均与 指令DIV相

同,只是除数、被除数和商都是带符号数即以补码

表示的数。

例:设AX= 0400 H、CL= A0 H,分析分别作为无符号数

和有符号数参加除法运算。

slide95

算术运算指令

(1) 无符号数时,采用DIV指令实现除法;

AX= 0400 H = 1024 D,CL= A0 H = 160 D

结果为: 商←AL= 06 H= 06 D

余数←AH= 40 H= 64 D

(2) 作为有符号数时,使用IDIV指令。

AX= 0400 H =+1024 D

CL= A0 H=-96 D

结果为:商←AL= 0F6 H= -10 D

余数←AH= 40 H= 64 D

slide96

算术运算指令

  • 在使用除法指令时应注意:
  • 除法指令的字节除法的商为8位,字除法的商为16位。
  • 如果字节除法时,被除数高8位的绝对值大于除数的绝对值;字除法时,被除数高16位的绝对值大于除数的绝对值,得到的商就会产生溢出。
  • 这种溢出在IBM PC中是由系统直接转入0型中断处理的
  • (3)非压缩BCD码除法调整指令 AAD
    • 格式: AAD
    • 功能: 对AX中的两个非压缩BCD码数进行调整;
  • AAD 必须在除法指令之后
slide97

算术运算指令

  • 符号扩展指令
  • 由于字节除法要求被除数为16位,字除法要求被除数为32位,往往需要用符号扩展的方法来得到所需的被除数格式,为此系统中提供了两条符号扩展指令。这两条指令不影响状态标志。

(1) 字节转换为字指令 CBW

格式:CBW

功能:把AL中的8位带符号数扩展为16位带符号数存于中

执行操作:如AL的最高位为0,则AH= 00 H;

如AL的最高位为1,则AH= FF H。

slide98

算术运算指令

(2) 字转换为双字指令CWD

格式:CWD

功能:把AX中的16位带符号数扩展为32位带符号数存

于DX、AX中。

执行操作: 如 AX的最高位为0,则DX= 0000 H;

如AX的最高位为1,则DX= FFFF H。

slide99

算术运算指令

  • 例:在A、B、C这3个字变量中各存有16位带符号数a、b、
  • c。用程序实现(a×b+c)/a的运算,并将商存入AX寄
  • 存器,余数存入DX寄存器。
  • MOV AX,A ;取操作数A
  • IMUL B ;A×B,乘积为32位
  • MOV BX,AX ;乘积暂存CX:BX
      • MOV CX,DX
      • MOV AX,C ;取操作数C
      • CWD ;符号扩展为32位
      • ADD AX,BX ;32位加法
      • ADC DX,CX
      • IDIV A ;除以A
slide100
3. 位处理指令 (13条)

逻辑运算指令

slide101

逻辑运算指令

  • 逻辑运算指令
  • (1)逻辑与指令 AND
  • 格式:AND dest,src(B/W)
  • 功能:源操作数和目的操作数逻辑与运算,结果送目的单元
  • 执行操作: dest ← dest ∧ src
    • dest可以是寄存器、存储器操作数。
    • src可为立即数、寄存器、存储器操作数
    • 标志位的影响
  • 置标志CF=0、OF=0;根据运算结果设置状态标志SF、
  • PF、ZF。
  • 通常用来清除某位(A∧0)或保留某位 (A ∧1)。
slide102

逻辑运算指令

例:AND AX,0FH

执行前:AX=0FBFAH

1111101111111010

0000000000001111

0000000000001010

执行后:AX=000AH

例 若(AL)=56H

取低4位:

取高4位:

AND AL, 00001111B ; 06H→AL

AND AL, 11110000B ; 50H→AL

slide103

逻辑运算指令

(2)逻辑或指令 OR

格式:OR dest,src (B/W)

功能:完成源操作数和目的操作数的逻辑或运算,结果

送目的单元

执行操作:dest ∨ src → dest

  • 指令操作、特征、使用和标志位影响均与 指令AND相同;
  • 用或运算实现使一个操作数中的某位保持不变

(A∨0=A),某置位1 (A∨1=1);

slide104

逻辑运算指令

例: OR AX,00FFH

执行前:AX=0AAAAH

1010101010101010

0000000011111111

1010101011111111

执行后: AX=0AAFFH

例:用OR指令进行代码组合。(BCD→ASCⅡ)

执行前:(AL)= (06)BCD

OR AL,30H ;36H →AL

slide105

逻辑运算指令

  • (3)逻辑非指 NOT
    • 格式:NOT dest (B/W)
    • 功能:对操作数按位取反,然后送回原处;
    • 执行操作: dest ← dest
    • dest可以是寄存器、存储器操作数。
    • 本指令不影响标志位。
slide106

1010101010101010

1111111111111111

0101010101010101

逻辑运算指令

  • (4)异或指令 XOR
    • 格式: XOR desr,src (B/W)
    • 功能:完成源操作数和目的操作数的逻辑异或运算,结
    • 果送目的单元
    • 行操作: dest ← dest⊕ src
  • 指令操作、特征、使用和标志位影响均与 指令AND相同;
  • 通常用于使某个操作数中的若干位维持不变,若干位取反。
  • A⊕0=A,A⊕1= A,A⊕A=0

例:XOR AX,0FFFFH

执行前:AX=0AAAAH

执行后:AX=5555H。

slide107

逻辑运算指令

  • (5)测试指令 TEST
    • 格式:TEST dest,src(B/W)
    • 功能:完成源操作数和目的操作数的逻辑与运算,根据
    • 运算结果置标志位SF、ZF、PF。
    • 执行操作 : (dest)∧(src)
  • 指令操作、特征、使用和标志位影响均与指令AND相同;
  • 通常用来检测某数的某位为1,还是为0;

例: 测试 DATA单元数据的最高位是1还是0

MOV AL , DATA

TEST   AL , 10000000B

JNZ PROC1 ; 最高位为1转PROC1

slide108

逻辑运算指令

  • 小结:
    • 逻辑运算指令可以对字节或字进行逻辑运算操作。逻辑运算是按位操作的,逻辑操作结果见表:
  • 逻辑运算指令可以对特定的位进行操作,利用逻辑运算指令可以完成屏蔽、置位以及测试等操作。
slide109

助记符操作数

举 例

注 释

NOT寄存器

存储器

NOT AX

NOT [DI]

(AX)取反→AX

AND 寄存器,寄存器

寄存器,存储器

存储器,寄存器

寄存器,立即数

存储器,立即数

AND AL,BL

AND CX,DATA

AND [DI],AL

AND CL,0FH

AND DATA,01H

(AL)∧(BL) →AL

((DI)) ∧(AL) →(DI)

(CL) ∧0FH →CL

TEST 寄存器,寄存器

寄存器,存储器

寄存器,立即数

存储器,立即数

TEST SI,DI

TEST SI,DATA

TEST BX,8000H

TEST [DI],01H

(SI) ∧(DI)

(BX) ∧8000H

逻辑运算指令表

slide110

OR寄存器,寄存器  

寄存器,存储器

存储器,寄存器

寄存器,立即数

存储器,立即数

OR AL,CL

OR CX,DATA[DI]

OR DATA,CL

OR CX,00FFH

OR [BX],0FH

(AL)∨(CL)→AL

(CX) ∨00FFH →CX

XOR寄存器,寄存器

寄存器,存储器

存储器,寄存器

寄存器,立即数

存储器,立即数

XOR CX,BX

XOR BL,[DI]

XOR [DI],AL

XOR SI,00CCH

XOR CODE,0D2H

(CX) (BX) →CX

(SI) 00CCH →SI

逻辑运算指令表

slide111

逻辑运算指令

  • 移位指令
    • 算术移位、逻辑移位、循环移位操作和左移、右移等。
    • 格式: OP dest,count (B/W)
    • 其中:
      • count表示移位次数。次数为1,则count可为立即数1,次数为2次以上,count为寄存器CL;
      • dest可以是寄存器、存储器操作数;
    • 算术逻辑移位指令影响SF、ZF、PF,CF、OF 状态标志;
    • 循环移位指令只影响CF、OF状态标志; AF均无定义;
slide112

CF dest

0

(补0)

逻辑运算指令

  • (1)逻辑左移指令SHL与算术左移指令SAL
    • 格式:SHL dest,count
  • SAL dest,count
    • 功能:将dest向左移动指定的位数,最低位补入相应个数0
  • 执行操作:可用下图表示:
  • 对状态标志位的影响:
    • 根据结果置标志: SF、ZF、PF;
    • CF=从目标操作数移出的最后一位;
    • 当执行多次移位指令后,OF不定,当执行一次移位指

令后 ,若最高位与CF不等,则OF = 1;

slide113

逻辑运算指令

  • 左移一位,操作数×2,左移n位,操作数×2n,使用时

要注意是否发生溢出。

例:SHL AH,1

SAL SI, CL

SAL WORD PTR [BX+5] ,1

SHL BYTE PTR [BX], CL

例:设DI=00FFH,写出计算DI×4→DI 的指令序列

执行指令:MOV CL,2

SAL DI,CL

执行后: DI=03FCH

slide114

Dest CF

逻辑运算指令

  • (2)算术右移指令SAR
    • 格式:SAR dest,Count
    • 功能:将dest向右移动指定的位数,最高位右移后 ,同时再用
    • 它自身的值填入最高位。

执行操作: 可用图表示:

  • 状态标志的影响同SHL、SAL指令
  • 实现右移n位,带符号数÷ 2n的功能;

例:MOV DL,0F4H ; DL:11110100 真值= -0001100B= -12

MOV CL,2

SAR  DL,CL ; DL: 11111101 真值= -0000011B= -3

slide115

Dest CF

0

逻辑运算指令

  • (3)逻辑右移指令SHR
    • 格式:SHR dest,Count
    • 功能:将dest向右移动指定的位数,最高位补以相应个数的0;
  • 执行操作:可用图表示:
  • 状态标志的影响同SHL、SAL指令
  • 实现右移n位,无符号数÷ 2n的功能;

例:若 DS=F800H,VALUE=1800H,(F9800H)=0008H。

执行指令序列:MOV CL,2

SHR VALUE,CL

执行后:(F980A)=0002H,CF=0,相当于(VALUE)除以4。

slide116

CF dest

逻辑运算指令

  • (4)循环左移指令ROL
    • 格式:ROL dest,Count
    • 功能:称为小循环左移,将目的操作数的最高位与最低位连接起来,组成一个环,将环中所有位一起向左移动由Count指定的次数。
  • 状态标志的影响:
    • 不影响 SF、ZF、PF、AF。
    • CF=从目标操作数移出的最后一位;执行多次移位指令后,OF不定。
    • 当执行一次移位指令后,若最高位与CF不等,则OF=1。
  • 用来改变操作数中所有位的位置。
slide117

dest CF

逻辑运算指令

  • (5)循环右移指令 ROR
    • 格式:ROR dest,Count
    • 功能:称为小循环右移,将目的操作数的最高位与最低位连接起来组成一个环,将环中所有位一起向右移动由Count指定的次数。
  • 执行操作: 用图表示:
  • 状态标志的影响同 ROL指令;
  • 用来改变操作数中所有位的位置;
slide118

CF dest

逻辑运算指令

  • (6)带进位循环左移 RCL
    • 格式:RCL dest,Count
    • 功能:称为大循环左移,将目的操作数连同CF标志位与最低位连接起来,组成一个环,将环中所有位一起向左移动由Count指定的次数;
  • 执行操作:如图所示:
  • 状态标志的影响同ROL指令;
  • 用来改变操作数中所有位的位置;
slide119

逻辑运算指令

  • (7)带进位循环右移指令 RCR
    • 格式:RCR dest,Count
    • 功能:称为大循环右移,将目的操作数连同CF标志位与最低位连接起来,组成一个环,将环中所有位一起向右移动由Count指定的次数;
  • 执行操作:如图所示:
  • 状态标志的影响同ROL指令;
  • 用来改变操作数中所有位的位置;
slide120

AX

BX

12 00

12 34

00 12

00 34

执行前:

逻辑运算指令

例:如AX=0012H、BX=0034H,要求执行程序将它们装配

在一起形成AX=1234H。

编程如下:

MOV CL,8

ROL AX,CL

ADD AX,BX

例: 将DX、AX组合32位操作数扩大一倍。

  • 程序:
    • SHL AX , 1
    • RCL DX , 1
slide122

程序转移指令

  • 程序转移指令(29条)
  • 程序在运行的过程中是按照段寄存器CS和程序计数器IP所指定的地址来取指令并运行的。程序转移指令是用来改变这两个寄存器的内容,从而改变程序的执行顺序。8086提供了5种转移指令:无条件转移指令、条件转移指令、重复控制指令、子程序调用指令和中断指令 。
slide125

程序转移指令

  • 无条件转移指令
  • 无条件转移指令无条件地将转移到指令中规定的内存目的地,执行指令会改变IP寄存器或CS寄存器的内容,但该指令不影响标志位的值。

(1)JMP 指令

格式:JMP 目标地址

功能:转移到目标地址对应的指令处执行;

无条件转移指令有五种格式:

  • 段内直接短转移
  • 段内直接近转移
  • 段内间接转移
  • 段间直接远转移
  • 段间间接转移
slide126

内存

...

OP

源程序 :

条件转移指令:JMP SHORT

next

(IP)

50H

D

=50H

=1050H-1000H

当前

8

...

...

...

3000:1000H

...

...

next:

MOV AL,03H

OP

3000:1050H

03H

...

(IP)=(IP)当前+D8

程序转移指令

  • 段内直接短转移
    • 格式:JMP SHORT OPR
    • 其中:OPR — 在汇编语言中为符号地址,在机器语言中存放
    • 位移量 D8,D8的范围在(-128 ~ 127)之间。
  • SHORT为短属性标号行
    • 执行的操作: (IP) ←(IP)+8位位移量D8。

例: JMP SHORT NEXT 指令执行过程:

slide127

程序转移指令

  • 段内直接近转移
  • 格式:JMP NEAR PTR OPR
  • 其中: OPR—在汇编语言中为符号地址,在机器语言中存
  • 放位移量D16,为16位补码,范围-32768~+32767H。
  • NEAR为近属性标号。
  • 执行的操作:(IP) ←(IP)+16位位移量D16

这两条指令也可以直接写成:JMP OPR,用户不需要考虑是短转移还是近转移,汇编程序在汇编时,会计算出JMP下一条指令与目标地址间的相对偏移量,若该偏移量在±127B之内时,产生一个短转移,否则,产生一个在±32KB范围内的近转移。

slide128

程序转移指令

  • 段内间接转移
    • 格式:JMP WORD PTR OPR
  • OPR —为16位寄存器、存储器操作数。
  • 执行操作:IP (EA)或 IP  reg16

例: JMP CX

JMP WORD PTR [DI]

例: JMP [BX]。

执行前:BX=2010H

DS=2000H

(22010H)=0FA34H。

执行后:IP=OFA34H

slide129

程序转移指令

  • 段间直接(远)转移
    • 格式: JMP FAR PTR OPR
    • 其中: OPR— 在汇编语言中为符号地址;
  • FAR为远属性标号;
    • 执行的操作:IP←OPR的段内偏移地址。
    • CS←OPR所在段的段地址。
  • 标号与控制转移指令不在同一段中,可以实现从一个段到另一个段的转移操作。
slide130

程序转移指令

  • 段间间接转移
    • 格式:JMP  DWORD PTR OPR
    • 其中:OPR —为存储器
    • 执行的操作:IP←(EA),CS←(EA+2)
    • 转移的段地址和偏移地址存放在内存中4个相邻的字节单元中,指令只能用存储器寻址方式取得段地址和偏移地址的值,修改CS寄存器和IP寄存器的内容。
slide131

程序转移指令

例:JMP DWORD PTR BUF[BX]

执行前:DS=3000H,BX=0020H,BUF=0100H

(30120H)=1234H,(30122H)=5678H

物理地址:PA=30000H+0100H+0020H=30120H

执行指令时,IP (30120H) ;CS (30122H)

执行后:IP=1234H, CS=5678H,

slide132

程序转移指令

  • (2)子程序调用指令
    • 子程序概念
    • 如果有一些程序段在不同地方反复出现,可以将这些程序段设计成为过程(子程序)供调用。过程结束,返回调用处。过程在程序中为具有独立功能的独立程序模块。
    • 子程序(过程)定义格式:
  • 符号名PROC 类型
  • ……
  • 符号名ENDP
    • 子程序调用指令包括:过程调用指令 CALL 和返回指令RET
slide133

程序转移指令

  • 格式: CALL OPR
  • 功能:把返回点(即CALL指令的下一条指令地址)压入堆栈保护后,转向目标地址处执行子程序。
  • 不影响标志位
  • CALL指令有四种形式:
  • 段内直接调用
  • 段内间接调用
  • 段间直接调用
  • 段间间接调用
slide134

程序转移指令

  • 段内直接调用
  • 格式:CALL NEAR OPR
  • 执行操作:SP SP-1,SP IPH;SP SP-1,
  • SP IPL;
  • IP 子程序入口地址;

OPR为NEAR属性的子程序名,表示范围在-32768~+32767之间的子程序入口地址;

slide135

程序转移指令

  • 段间直接调用
    • 格式:CALL FAR PTR OPR
    • 执行操作:SP SP-1,SP IPH;SP SP-1,
    • SP IPL ,SP CS
    • IP  子程序入口偏移地址
    • CS  子程序入口段基地址
    • OPR为FAR属性的子程序名,可位于任何存储区域;
slide136

程序转移指令

  • 段内间接调用
    • 格式:CALL WORD PTR OPR
    • 执行操作:SP SP-1,SP IPH;SP SP-1,
    • SP IPL;
  • IP 由寄存器或存储器内容表示的子程序入
  • 口地址
    • OPR为16位寄存器或单字存储单元
slide137

程序转移指令

  • 段间间接调用

格式:CALL DWORD PTR OPR

执行操作:SP SP-1,SP IPH;SP SP-1,

    • SP IPL; SP CS
  • IP 由第1个字存储单元内容表示的子程序入
  • 口偏移地址。
  • CS 由第2个字存储单元内容表示的子程序入
  • 口段基地址。
slide138

程序转移指令

例:…

CALL subp ; YYY入栈

YYY:…

subp PROC NEAR ;过程定义

RET ;返回

slide139

程序转移指令

  • (3)返回指令 RET
    • 格式:RET
    • 功能:过程执行完后,返回调用程序的断点处继续执行原
    • 程序
    • 执行操作:
    • 若为段内调用返回指令,从堆栈取出返回点的偏移量给IP,实现调用返回;
    • 若为段间调用返回指令,从堆栈取出返回点的偏移量给IP,还取出返回点的段基地址给CS ,实现调用返回;
    • 指令不影响标志位
    • 指令应放在子程序的末尾
slide140

建立转移条件

Y

条件满足

N

转分支

继续

程序转移指令

  • 条件转移指令
    • 条件转移指令是根据标志寄存器(FR)的状态是否满足指定的条件而发生转移。
    • 执行指令只改变IP寄存器内容,且转移目标范围在(-128~+127)。
    • 该指令不影响标志位的值
    • 格式:Jcc OPR
    • 功能:当条件成立时,实
    • 现程序的转移
slide141

程序转移指令

  • 按转移条件不同,条件转移指令可以分为三大类:
    • 以单个状态标志作为转移条件;
    • 以两个无符号数比较的结果为转移条件;
    • 以两个带符号数比较的结果为转移条件

根据标志位CF、ZF、SF、PF、OF的状态,作为转移条件。

slide143

程序转移指令

(2)比较两个无符号数,并根据比较的结果转移

两个无符号数A、B,作减法A-B ,根据无符号数A、B的大小、相等情况产生分支 ;

slide144

程序转移指令

(3) 比较两个带符号数,并根据比较的结果转移

两个带符号数A、B,作减法A-B ,根据带符号数A、B的大小、相等情况产生分支 ;

slide145

第二章:微处理器的指令系统

(4)条件转移指令应用

例:比较二个数是否相等,如相等做动作1,否则做动作2

……

CMP AX,BX

JE action_1

Action_2: ……

……

action_1:……

slide146

程序转移指令

例:带符号数 X,Y, 若X > 50,则 转too_high;否则执行

X-Y ,如溢出转overflow,不溢出将结果存result。

MOV AX,X

CMP AX,50

JG too_high ;大于转too_high

SUB AX,Y

JO overflow ;溢出转overflow

MOV result ,AX ;不溢将数据存存储单元

too_high: ……

overflow: ……

slide147

程序转移指令

  • 重复控制指令
  • 使用CX寄存器作计数器作为控制条件实现转移;
  • 执行指 令只改变IP寄存器内容,且转移目标 范围在(-128~+127);
  • 该指令不影响标志位的值;
  • 循环控制指令用于使一些程序段反复执行形成循环程序;
  • 重复控制指令有四种:
slide148

程序转移指令

(1)循环指令 LOOP

格式:LOOP OPR

OPR 为目标地址,一般以符号地址表示。

执行操作: CX ← CX - 1

(CX)≠0,转目标地址;CX=0,执行下一条指令

  • 执行指令前应将循环次数初值置CX寄存器中
  • 该指令等效于指令:DEC CX

JNZ OPD

  • 使用形式: MOV CX,N
  • BEGIN: ┊
  • LOOP BEGIN

循环体

slide149

程序转移指令

(2)当结果为零或相等循环指令 LOOPZ/LOOPE

(3)当结果不为零或不相等循环指令 LOOPNZ/LOOPNE

(4)测试CX的值为零转移指令 JCXZ

slide150

程序转移指令

(4)中断指令

  • 中断指令 INT
    • 格式:INT n或:INT
  • n为类型码,是 0—255的常数或表达式。
    • 功能:该指令将产生一个软件中断,把控制转向一个类
    • 型号为n的软中断。
  • 执行的操作:
    • 把标志寄存器的内容压栈 SP←SP-2,(SP+1,SP) ← FR
    • 清中断标志位和陷阱标志位 IF←0,TF←0。
    • 将现行程序的CS和IP的内容压栈:
  • SP←SP-2,(SP+1,SP)←CS; SP←SP-2,(SP+1,SP)←(IP)
slide151

程序转移指令

  • 溢出中断指令 INTO

格式:INTO

功能:该指令检测OF标志位,当OF=1时,将立即产生一

个中断类型为4的中断,执行中断服务程序,当

OF=0,则执行INTO的下一条指令。

  • 执行操作:当 OF=1则执行:
    • 把FR内容压栈
    • TF标志、IF标志清0
    • 断点地址CS和IP内容压栈
    • 中断服务程序入口段基地址和偏移地址字送入CS和IP
slide152

程序转移指令

  • 中断返回指令 IRET
  • 格式: IRET
  • 功能:用于中断处理程序,以返回被中断的程序断点处继
  • 续执行。
  • 执行操作:从堆栈中取出被中断的程序的代码段地址、
  • 偏移地址和标志状态分别送入CS、IP和标志
  • 寄存器FR。

◆ 任何一个中断服务程序的末尾部必须安排一条IRET指令。

slide153

串操作指令

  • 串操作指令

串——地址连续的字节或字存储单元,通常用于存放同一

类数据。

数据源:源串;数据结果:目的串。

串操作—— 对串中的每一项都执行的操作。如:串传送、

查找、比较等。

串操作指令——对串元素实现传送、比较、检索、装入、

存储等操作,并自动修改地址指针。可以

处理的数据串长度最多为64K字节。

slide155

串操作指令

  • 源操作数用SI寻址,隐含DS值为段地址,可以用段跨越前缀指定其它段。
  • 目标操作数用DI寻址,隐含ES为段地址;
  • 用CX存待处理的串元素个数。每处理一个串元素,自动
  • 使 CX-1;
  • 自动修改串指针:
  • 方向标志DF决定指针的修改方向——DF=0,指针加;
  • DF =1,指针减。
slide156

串操作指令

  • 串传送指令 MOVS

格式:MOV Dest,Src

MOVB ;字节串传送

MOVW ;字串传送

执行操作:(DI)←(SI)

  • 格式一:MOV ES:BYTE PTR[DI],DS:[SI]
  • 字节操作:SI←SI±1,DI ← DI±1
  • 字操作: SI←SI±2,DI ← DI±2
  • 当DF=0时,用+号,当DF=1时,用-号。
  • 使用指令前先设置SI、DI的初值,设置DF的值。
slide157

串操作指令

  • 存入串指令 STOS
  • 格式:STOS Dest
  • STOSB;存入字节串
  • STOSW ;存入字串
  • 功能:把AL/AX的内容存入由DI指定的ES段中的单元。并
  • 根据DF的值及数据类型来修改DI的内容。
  • 字节操作:(DI)← AL,DI ←DI±1
  • 字操作:(DI)← AX,DI ←DI±2
slide158

串操作指令

  • 从串取指令 LODS
  • 格式:LODS SRC
  • LODSB;从字节串取
  • LODSW;从字串取
  • 功能:把由SI指定的数据段中字节或字单元的内容送入AL
  • 或AX中,并根据DF的值及数据类型修改SI的值。
  • 字节操作:AL ←(SI),SI ←SI±1
  • 字操作:AX ←(SI,SI+1),SI ←SI±2
slide159

串操作指令

  • 串比较指令 CMPS
  • 格式:CMPS SRC,DEST
  • CMPSB;字节串比较
  • CMPSW ;字串比较
  • 功能:把由SI指定的数据段中一个字节(字)与由DI指向的
  • 附加段中的一个字节(字)相减,不保留结果。影响
  • 标志位。
  • 字节操作:(SI)-(DI),SI ←SI±1,DI ←DI±1
  • 字操作:(SI±1)(SI)-(DI±1)(DI),SI ←SI±2,DI ←DI±2
slide160

串操作指令

  • 串扫描指令 SCAS
  • 格式:SCAS DEST
  • SCASB;字节串扫描
  • SCASW ;字串扫描
  • 功能:把AL(AX) 的内容与由DI指向的附加段中的一个字节
  • (字)相减,不保留结果。影响标志位。
  • 字节操作:AL-(DI),DI ←DI±1
  • 字节操作:AX-(DI±1)(DI),DI ←DI±2
slide161

串操作指令

  • 与串指令配合使用的重复前缀
  • RET MOVS/LODS/STOS (B/M)

功能:若CX≠0,重复执行,CX ←CX-1

若CX=0,推出重复,结束串操作。

  • REPE/REPZCMPS/SCAS (B/W)
  • 功能:若CX≠0且ZF=1,重复执行, CX ←CX-1
  • 若CX=0或ZF=0,推出重复,结束串操作。
  • REPNE/REPNZCMPS/SCAS (B/W)
  • 功能:若CX≠0且ZF=0,重复执行, CX ←CX-1
  • 若CX=0或ZF=1,推出重复,结束串操作。
slide162

串操作指令

串操作举例:

例1:MOV SI,0050H

MOV DI,0100H

CLD

MOVSB

执行前:DS=2000H,ES=3000H,

(20050H)=7AH,(30100H)=C5H

执行后:(20050H)=7AH,(30100H)=7AH

slide163

串操作指令

例2:

MOV SI,0050H

MOV DI,0100H

MOV CX,5

CLD

REP MOVSB

执行前:

DS=2000H,ES=3000H,

20000H

DS

20000H

DS

20050H

20051H

20052H

20053H

20054H

20055H

20050H

20051H

20052H

20053H

20054H

20055H

30000H

30000H

30100H

30101H

30102H

30103H

30104H

30105H

30100H

30101H

30102H

30103H

30104H

30105H

执行前:

执行后:

slide164

串操作指令

例3:比较两个字符串,找出它们不匹配的位置。

MOV SI,1500H

MOV DI,0200H

MOV CX,11H

CLD

REPE CMPSB

执行前:

DS=2000H

ES=3000H

DS

20000H

DS

20000H

21500H

21501H

21502H

21503H

21504H

21505H

21500H

21501H

21502H

21503H

21504H

21505H

SI→

ES

30000H

ES

30000H

30200H

30201H

30202H

30203H

30204H

30205H

30100H

30101H

30102H

30103H

30104H

30105H

DI→

执行前:

执行后:

slide166

处理器控制指令

  • 标志操作指令
  • 主要用于设置或清除标志位:CF、DF、IF。
  • 该类指令专门用于处理器的控制,指令格式中均不带操作数。
  • 除了设置和清除标志的指令,只影响指定的标志,其它指令均不影响标志位
slide167

指令格式

执行操作

作用

CLC

CF=0

对CF的操作 使进位标志CF置为0

STC

CF=1

对CF的操作 使进位标志CF置为1

CMC

CF CF

对CF的操作 使进位标志CF取反

DF=0

CLD

对DF的操作 串操作指令指针SI和DI自动增量

STD

DF=1

对DF的操作 串操作指令指针SI和DI自动减量

CLI

IF=0

对IF的操作 禁止CPU响应可屏蔽中断INTR

STI

IF=1

对IF的操作 允许CPU响应可屏蔽中断INTR

处理器控制指令

slide168

处理器控制指令

  • 其他处理器控制指令
  • (1)空操作指令 NOP
  • 格式:NOP
  • 功能:不执行任何操作(即CPU完成一次空操作),延
  • 迟3个时钟周期后,继续执行下条指令。
  • 作用:
    • 其机器码占一个字节单元, 在调试程序时,修改程序用;
    • 常被用于软件延时程序中,作短暂延时用 。
slide169

处理器控制指令

(2)停机指令 HLT

格式:HLT

功能:使CPU处于暂停状态

作用:用于等待外部中断,中断处理结束后,继续执行

HLT后的下一条指令。

  • 脱离暂停状态的条件 :
    • RESET线上有复位信号;
    • 在NMI线上有中断请求;
    • 在开放中断情况下(IF=1),在INTR线上有中断请求;
slide170

(3)等待指令 WAIT

格式:WAIT

功能:CPU每隔5个时钟周期检测TEST引脚,若为低电

平,CPU退出等待状态,执行下一跳指令。

(4)换码指令 ESC

格式:ESC opcode,src

功能:主要用于多处理器系统中主CPU同外部处理器的协

调工作。

(5) 封锁指令 LOCK

格式:LOCK 指令

功能:它与其他指令配合使用,禁止其它总线主设备访问总线。