微型计算机原理
This presentation is the property of its rightful owner.
Sponsored Links
1 / 148

微型计算机原理 基于 16 位机 PowerPoint PPT Presentation


  • 76 Views
  • Uploaded on
  • Presentation posted in: General

微型计算机原理 基于 16 位机. 概述. 微处理器. 指令系统. 第一章  . 微型计算机概述. 1.1 微型计算机的发展和应用. 1946 年,世界上出现第一台数字式电子计算机 ENIAC (电子数据和计算器) 发展到以大规模集成电路为主要部件的第四代,产生了微型计算机 1971 年, Intel 公司设计了世界上第一个微处理器芯片 Intel4004 ,开创了一个全新的计算机时代. 1.1.1 微型计算机的发展. 第 1 代 : 4 位和低档 8 位微机 4004→4040→8008 第 2 代 :中高档 8 位微机

Download Presentation

微型计算机原理 基于 16 位机

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


16 3770283

微型计算机原理基于16位机


16 3770283

概述

微处理器

指令系统


16 3770283

第一章  

微型计算机概述


16 3770283

1.1 微型计算机的发展和应用

  • 1946年,世界上出现第一台数字式电子计算机ENIAC(电子数据和计算器)

  • 发展到以大规模集成电路为主要部件的第四代,产生了微型计算机

  • 1971年,Intel公司设计了世界上第一个微处理器芯片Intel4004,开创了一个全新的计算机时代


1 1 1

1.1.1 微型计算机的发展

  • 第1代:4位和低档8位微机

    4004→4040→8008

  • 第2代:中高档8位微机

    Z80、I8085、M6800,Apple-II微机

  • 第3代:16位微机

    8086→8088→80286,IBM PC系列机


1 1 11

1.1.1 微型计算机的发展(续)

  • 第4代:32位微机

    • 80386→80486→Pentium→Pentium II →Pentium III →Pentium 4

    • 32位PC机、Macintosh机、PS/2机

  • 第5代:64位微机

    Itanium、64位RISC微处理器芯片

    微机服务器、工程工作站、图形工作站


1 1 2

1.1.2 微型计算机的应用

  • 计算机应用通常分成如下各个领域

    • 科学计算,数据处理,实时控制

    • 计算机辅助设计,人工智能,……

  • 由于微型计算机具有如下特点

    • 体积小、价格低

    • 工作可靠、使用方便、通用性强……

  • 所以,可以分为两个主要应用方向


1 1 21

1.1.2 微型计算机的应用

将CPU以及其他主要部件(如ROM、RAM、I/O接口)都集成在一个微处理器芯片中

例如:常用的MCS-51、MCS-96

  • 用于数值计算、数据处理及信息管理方向

    • 通用微机,例如:PC微机

    • 功能越强越好、使用越方便越好

  • 用于过程控制及智能化仪器仪表方向

    • 专用微机,例如:单片机、工控机

    • 可靠性高、实时性强

    • 程序相对简单、处理数据量小


16 3770283

微型计算机系统

微处理器

微型计算机

运算器控制器

寄存器组

内存储器 总线

输入输出

接口电路

外部设备 软件

1.2 微型计算机的系统组成

区别


1 2 1

系统总线BUS

地址总线AB

线

数据总线DB

控制总线CB

存储器

I/O接口

I/O设备

图1.1 微型计算机的系统组成

1.2.1 微型计算机的硬件组成

  • 微处理器子系统

  • 存储器

  • I/O设备和I/O接口

  • 系统总线


16 3770283

系统总线

  • 总线是指传递信息的一组公用导线

  • 总线是传送信息的公共通道

  • 微机系统采用总线结构连接系统功能部件

  • 总线信号可分成三组

    • 地址总线AB:传送地址信息

    • 数据总线DB :传送数据信息

    • 控制总线CB :传送控制信息


16 3770283

总线信号

举例

  • 地址总线AB

    • 输出将要访问的内存单元或I/O端口的地址

    • 地址线的多少决定了系统直接寻址存储器的范围

  • 数据总线DB

    • CPU读操作时,外部数据通过数据总线送往CPU

    • CPU写操作时,CPU数据通过数据总线送往外部

    • 数据线的多少决定了一次能够传送数据的位数

  • 控制总线CB

    • 协调系统中各部件的操作,有输出控制、输入状态等信号

    • 控制总线决定了系统总线的特点,例如功能、适应性等

举例

特点


1 2 2

1.2.2 微型计算机的软件系统

为什么采用汇编语言?


1 3 ibm pc

1.3 IBM PC系列机系统

16位IBM PC系列机是32位微机的基础

8088CPU

IBM PC机

IBM PC/XT机

IBM PC/AT机


1 3 1

1.3.1 硬件基本组成

16位和

32位PC机的基本部件相同


1 3 2

8259

中断控制器

只读存储器ROM

随机存储器

RAM

地址总线

I/O

地址锁存器

8087

8088

数据总线

数据收发器

控制总线

8288

总线控制器

8237

DMA控制器

8253

定时控制器

8255

并行接口

8284

时钟发生器

系统配置开关

键盘

接口

扬声器

接口

1.3.2 主机板组成

  • 微处理器子系统

    8088:16位内部结构、8位数据总线、20位地址总线、4.77MHz主频

  • 存储器

    ROM-BIOS、主体为RAM

  • I/O接口控制电路

    8259A、8253、8237A、8255等

  • I/O通道

    62线的IBM PC总线


1 3 3

000000H

系统RAM

640KB

0A0000H

显示RAM

128KB

0C0000H

常规内存

1MB

扩展ROM

128KB

0E0000H

保留ROM

64KB

0F0000H

基本ROM

64KB

100000H

扩展RAM

≈15MB

扩展内存

15MB

FE0000H

保留ROM

64KB

基本ROM

64KB

FFFFFFH

图1.5 存储空间的分配

1.3.3 存储空间的分配

常规内存:1MB

  • 基本RAM区:640KB

  • 保留RAM区:128KB

  • 扩展ROM区:128KB

  • 基本ROM区:64KB

    扩展内存:用作RAM区


1 3 4 i o

000-01F

020-03F

040-05F

060-07F

080-09F

0A0-0BF

0C0-0DF

0E0-0FF

DMA控制器1

中断控制器1

定时计数器

并行接口电路

DMA页面寄存器

中断控制器2

DMA控制器2

协处理器

I/O

1F0-1F8

200-207

278-27F

2F8-2FF

378-37F

380-38F

3A0-3AF

3B0-3BF

3D0-3DF

3F0-3F7

3F8-3FF

硬盘适配器

游戏接口

并行打印机接口LPT2

串行通信接口COM2

并行打印机接口LPT1

SDLC通信接口

BSC通信接口

单色显示/打印机适配器

彩色图形适配器CGA

软盘适配器

串行通信接口COM1

1.3.4 I/O空间的分配

  • 80x86访问外设时,只使用低16位A0~A15,寻址64K个8位I/O端口

  • PC机仅使用低10位A0~A9,寻址1024个8位I/O端口


1 1 4

第1章:1.4 计算机中的数据表示

  • 存储容量的表达

    • 比特b(二进制1位)

    • 字节B (二进制8位)

    • 1KB=210B=1024B

    • 1MB=220B、1GB=230B

  • 进制的表示

    • 二进制数用B或b结尾

    • 十进制数可不用结尾字母,

      也可用D或d结尾

    • 十六进制数用H或h结尾


16 3770283

第二章

微处理器


16 3770283

第二章

微处理器主要的性能指标

主频

外频

工作电压

制造工艺

地址线宽度

数据线宽度

内置协处理器


16 3770283

微处理器飞速发展

IA-64

(安腾)

奔腾4代

奔腾3代

奔腾2代

奔腾

80486

80386

80286

8086

4004


16 3770283

2.1 8086/8088微处理器

Intel公司1978年推出8086

1979年推出8088,于1981年用于IBM PC/XT中

2.11 8086/8088的内部结构

 一、总线接口部件BIU(Bus interface Unit)

结构

 二、执行部件(Execution Unit)


2 2 1 2 8088 8086

第2章: 2.1.2 8088/8086的功能结构

  • 8088的内部结构从功能上分成两个单元

    1. 总线接口单元BIU

    管理8088与系统总线的接口

    负责CPU对存储器和外设进行访问

    2. 执行单元EU

    负责指令的译码、执行和数据的运算

  • 两个单元相互独立,分别完成各自操作,还可以并行执行,实现指令预取(指令读取和执行的流水线操作)


2 2 1 3 8088 8086

第2章:2.1.3 8088/8086的寄存器结构

图示

  • 8088/8086的寄存器组有

    • 8个通用寄存器

    • 4个段寄存器

    • 1个标志寄存器

    • 1个指令指针寄存器

      他们均为16位!

  • 汇编语言程序员看到的处理器,就是寄存器

  • 所以,一定要熟悉这些寄存器的名称和作用


16 3770283

第2章:1. 通用寄存器

  • 8088有8个通用的16位寄存器

    (1)数据寄存器: AX BX CX DX

    (2)变址寄存器: SI DI

    (3)指针寄存器: BP SP

  • 4个数据寄存器还可以分成高8位和低8位两个独立的寄存器,这样又形成8个通用的8位寄存器

    AX: AH ALBX: BH BL

    CX: CH CLDX: DH DL

内部结构


16 3770283

第2章:(1)数据寄存器

  • AX称为累加器(Accumulator)

    使用频度最高。用于算术、逻辑运算以及与外设传送信息等

  • BX称为基址寄存器(Base address Register)

    常用做存放存储器地址

  • CX称为计数器(Counter)

    作为循环和串操作等指令中的隐含计数器

  • DX称为数据寄存器(Data register)

    常用来存放双字长数据的高16位,或存放外设端口地址


16 3770283

第2章:(1)数据寄存器

  • AX称为累加器(Accumulator)

    使用频度最高。用于算术、逻辑运算以及与外设传送信息等

  • BX称为基址寄存器(Base address Register)

    常用做存放存储器地址

  • CX称为计数器(Counter)

    作为循环和串操作等指令中的隐含计数器

  • DX称为数据寄存器(Data register)

    常用来存放双字长数据的高16位,或存放外设端口地址

内部结构


16 3770283

第2章:(2)变址寄存器

  • 16位变址寄存器SI和DI

  • 常用于存储器变址寻址方式时提供地址

    • SI是源地址寄存器(Source Index)

    • DI是目的地址寄存器(Destination Index)

  • 在串操作类指令中,SI、DI还有较特殊的用法

  • 现在不必完全理解,以后会详细展开

内部结构


16 3770283

第2章:(3)指针寄存器

  • 指针寄存器用于寻址内存堆栈内的数据

    • SP为堆栈指针寄存器(Stack Pointer),指示堆栈段栈顶的位置(偏移地址)

    • BP为基址指针寄存器(Base Pointer),表示数据在堆栈段中的基地址

  • SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址

堆栈(Stack)是主存中一个特殊的区域,采用“先进后出”或“后进先出”存取操作方式、而不是随机存取方式。

用8088/8086形成的微机系统中,堆栈区域被称为堆栈段

内部结构


16 3770283

第2章:2. 指令指针寄存器

  • IP(Instruction Pointer)为指令指针寄存器,指示主存储器指令的位置

  • 随着指令的执行,IP将自动修改以指示下一条指令所在的存储器位置

  • IP寄存器是一个专用寄存器

  • IP寄存器与CS段寄存器联合使用以确定下一条指令的存储单元地址

内部结构


16 3770283

第2章:3. 标志寄存器

  • 标志(Flag)用于反映指令执行结果或控制指令执行形式

  • 8088处理器的各种标志形成了一个16位的标志寄存器FLAGS(程序状态字PSW寄存器)

  • 程序设计需要利用标志的状态

内部结构


16 3770283

15 12

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

第2章:标志寄存器-分类

  • 状态标志--用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它

    CFZFSFPFOFAF

  • 控制标志--可由程序根据需要用指令设置,用于控制处理器执行指令的方式

    DFIFTF

标志寄存器FLAGS

存储

内部结构


2 cf carry flag

当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;

否则CF=0

第2章:进位标志CF(Carry Flag)

3AH + 7CH=B6H,没有进位:CF = 0

AAH + 7CH=(1)26H,有进位:CF = 1


2 zf zero flag

第2章:零标志ZF(Zero Flag)

  • 若运算结果为0,则ZF=1;

    否则ZF=0

  • 注意:ZF为1表示的结果是0

3AH+7CH=B6H,结果不是零:ZF=0

84H+7CH=(1)00H,结果是零:ZF=1


2 sf sign flag

第2章:符号标志SF(Sign Flag)

  • 运算结果最高位为1,则SF=1;

    否则SF=0

  • 有符号数据用最高有效位表示数据的符号

    所以,最高有效位就是符号标志的状态

3AH+7CH=B6H,最高位D7=1:SF=1

84H+7CH=(1)00H,最高位D7=0:SF=0


2 pf parity flag

第2章:奇偶标志PF(Parity Flag)

  • 当运算结果最低字节中“1”的个数为零或偶数时,PF=1;否则PF=0

  • PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作

3AH+7CH=B6H=10110110B

结果中有5个“1”,是奇数:PF=0


2 of overflow flag

第2章:溢出标志OF(Overflow Flag)

  • 若算术运算的结果有溢出,则OF=1;

    否则 OF=0

3AH + 7CH=B6H,产生溢出:OF=1

AAH + 7CH=(1)26H,没有溢出:OF=0

返回


16 3770283

第2章:什么是溢出

  • B6H=10110110B,最高位为1,

    作为有符号数是负数

  • 对B6H求反加1等于:

    01001001B+1=01001010B=4AH=74

  • 所以,B6H表达有符号数的真值为-74

  • 处理器内部以补码表示有符号数

  • 8位表达的整数范围是:+127 ~ -128

  • 16位表达的范围是:+32767 ~ -32768

  • 如果运算结果超出这个范围,就产生了溢出

  • 有溢出,说明有符号数的运算结果不正确

3AH+7CH=B6H,就是58+124=182,

已经超出-128~+127范围,产生溢出,故OF=1;补码B6H表达真值是-74,显然运算结果也不正确


16 3770283

第2章:溢出和进位的区别

  • 溢出标志OF和进位标志CF是两个意义不同的标志

  • 进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确

  • 溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确


16 3770283

第2章: 溢出和进位的对比

例1:3AH+7CH=B6H

无符号数运算:58+124=182

范围内,无进位

有符号数运算: 58+124=182

范围外,有溢出

例2:AAH+7CH=(1)26H

无符号数运算:170+124=294

范围外,有进位

有符号数运算:-86+124=28

范围内,无溢出


16 3770283

第2章:溢出和进位的应用场合

  • 处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF

  • 应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出


16 3770283

第2章:溢出的判断

  • 判断运算结果是否溢出有一个简单的规则:

  • 只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确

  • 其他情况下,则不会产生溢出

例1:3AH+7CH=B6H溢出

例2:AAH+7CH无溢出

例3:3AH-7CH无溢出

例4:AAH-7CH=2DH溢出

返回


2 af auxiliary carry flag

第2章:辅助进位标志AF(Auxiliary Carry Flag)

  • 运算时D3位(低半字节)有进位或借位时,AF=1;否则AF=0

3AH+7CH=B6H,D3有进位:AF=1

这个标志主要由处理器内部使用,

用于十进制算术运算调整指令中,

用户一般不必关心


2 df direction flag

第2章:方向标志DF(Direction Flag)

  • 用于串操作指令中,控制地址的变化方向:

    • 设置DF=0,存储器地址自动增加;

    • 设置DF=1,存储器地址自动减少

  • CLD指令复位方向标志:DF=0

  • STD指令置位方向标志:DF=1


2 if interrupt enable flag

第2章:中断允许标志IF(Interrupt-enable Flag)

  • 控制可屏蔽中断是否可以被处理器响应:

    • 设置IF=1,则允许中断;

    • 设置IF=0,则禁止中断

  • CLI指令复位中断标志:IF=0

  • STI指令置位中断标志:IF=1


2 tf trap flag

第2章:陷阱标志TF(Trap Flag)

  • 用于控制处理器进入单步操作方式:

    • 设置TF=0,处理器正常工作;

    • 设置TF=1,处理器单步执行指令

  • 单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断

  • 这种内部中断称为单步中断

  • 所以TF也称为单步标志

  • 利用单步中断可对程序进行逐条指令的调试

  • 这种逐条指令调试程序的方法就是单步调试


2 2 1 4 8088 8086

第2章:2.1.4 8088/8086的存储器结构

  • 存储器是计算机存储信息的地方。掌握数据存储格式,以及存储器的分段管理对以后的汇编程序设计非常重要

  • 你能区别寄存器、存储器(主存)、外存(包括硬盘、光盘、磁带等存储介质)吗?

答案


16 3770283

第2章:寄存器、存储器和外存的区别

  • 寄存器是微处理器(CPU)内部暂存数据的存储单元,以名称表示,例如:AX,BX..….等

  • 存储器也就是平时所说的主存,也叫内存,可直接与CPU进行数据交换。主存利用地址区别

  • 外存主要指用来长久保存数据的外部存储介质,常见的有硬盘、光盘、磁带、U盘等。外存的数据只能通过主存间接地与CPU交换数据

  • 程序及其数据可以长久存放在外存,在运行需要时才进入主存


16 3770283

第2章:1. 数据的存储格式

图示

  • 计算机中信息的单位

    • 二进制位Bit:存储一位二进制数:0或1

    • 字节Byte:8个二进制位,D7~D0

    • 字Word:16位,2个字节,D15~D0

    • 双字DWord:32位,4个字节,D31~D0

  • 最低有效位LSB:数据的最低位,D0位

  • 最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31位


16 3770283

第2章:存储单元及其存储内容

  • 每个存储单元都有一个编号;被称为存储器地址

  • 每个存储单元存放一个字节的内容

0002H单元存放有一个数据34H

表达为[0002H]=34H

图示


16 3770283

第2章:多字节数据存放方式

  • 80x86处理器采用“低对低、高对高”的存储形式,被称为“小端方式Little Endian”。

  • 相对应还存在“大端方式Big Endian”。

  • 多字节数据在存储器中占连续的多个存储单元:

    • 存放时,低字节存入低地址,高字节存入高地址;

    • 表达时,用它的低地址表示多字节数据占据的地址空间。

  • 图2-5中0002H“字”单元的内容为:

    • [0002H] = 1234H

  • 0002H号“双字”单元的内容为:

    • [0002H] = 78561234H

图示


16 3770283

第2章:数据的地址对齐

  • 同一个存储器地址可以是字节单元地址、字单元地址、双字单元地址等等(视具体情况来确定)

  • 字单元安排在偶地址(xxx0B)、双字单元安排在模4地址(xx00B)等,被称为“地址对齐(Align)”

  • 对于不对齐地址的数据,处理器访问时,需要额外的访问存储器时间

  • 应该将数据的地址对齐,以取得较高的存取速度


16 3770283

第2章:2. 存储器的分段管理

  • 8088CPU有20条地址线

    • 最大可寻址空间为220=1MB

    • 物理地址范围从00000H~FFFFFH

  • 8088CPU将1MB空间分成许多逻辑段(Segment)

    • 每个段最大限制为64KB

    • 段地址的低4位为0000B

  • 这样,一个存储单元除具有一个唯一的物理地址外,还具有多个逻辑地址


16 3770283

第2章:物理地址和逻辑地址

  • 8088CPU存储系统中,对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H ~ FFFFFH

  • 分段后在用户编程时,采用逻辑地址,形式为

    段基地址 :段内偏移地址

物理地址 14700H

逻辑地址 1460H:100H

分隔符


16 3770283

第2章:逻辑地址

  • 段地址说明逻辑段在主存中的起始位置

  • 8088规定段地址必须是模16地址:xxxx0H

  • 省略低4位0000B,段地址就可以用16位数据表示,就能用16位段寄存器表达段地址

  • 偏移地址说明主存单元距离段起始位置的偏移量

  • 每段不超过64KB,偏移地址也可用16位数据表示


16 3770283

14600H

13800H

段地址左移4位

加上偏移地址

得到物理地址

+ 100H

+ F00H

14700H

14700H

第2章:物理地址和逻辑地址的转换

  • 将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址

  • 一个物理地址可以有多个逻辑地址

逻辑地址1460:100、1380:F00

物理地址14700H 14700H


16 3770283

第2章:3. 段寄存器

  • 8088有4个16位段寄存器

    • CS(代码段)指明代码段的起始地址

    • SS(堆栈段)指明堆栈段的起始地址

    • DS(数据段)指明数据段的起始地址

    • ES(附加段)指明附加段的起始地址

  • 每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途

CS

SS

DS

ES

如何分配各个逻辑段?

内部结构


2 cs code segment

第2章:代码段寄存器CS(Code Segment)

  • 代码段用来存放程序的指令序列

    • 代码段寄存器CS存放代码段的段地址

    • 指令指针寄存器IP指示下条指令的偏移地址

  • 处理器利用CS:IP取得下一条要执行的指令


2 ss stack segment

第2章:堆栈段寄存器SS(Stack Segment)

  • 堆栈段确定堆栈所在的主存区域

    • 堆栈段寄存器SS存放堆栈段的段地址

    • 堆栈指针寄存器SP指示堆栈栈顶的偏移地址

  • 处理器利用SS:SP操作堆栈顶的数据


2 ds data segment

第2章:数据段寄存器DS(Data Segment)

  • 数据段存放运行程序所用的数据

    • 数据段寄存器DS存放数据段的段地址

    • 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址

  • 处理器利用DS:EA存取数据段中的数据


2 es extra segment

第2章:附加段寄存器ES(Extra Segment)

  • 附加段是附加的数据段,也保存数据:

    • 附加段寄存器ES存放附加段的段地址

    • 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址

  • 处理器利用ES:EA存取附加段中的数据

  • 串操作指令将附加段作为其目的操作数的存放区域


16 3770283

第2章:如何分配各个逻辑段

  • 程序的指令序列必须安排在代码段

  • 程序使用的堆栈一定在堆栈段

  • 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段

  • 数据的存放比较灵活,实际上可以存放在任何一种逻辑段中

演示


16 3770283

第2章:段超越前缀指令

  • 没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段

  • 默认的情况允许改变,需要使用段超越前缀指令;8088指令系统中有4个:

    • CS:;代码段超越,使用代码段的数据

    • SS: ;堆栈段超越,使用堆栈段的数据

    • DS: ;数据段超越,使用数据段的数据

    • ES: ;附加段超越,使用附加段的数据

示例


16 3770283

第2章:段超越的示例

  • 没有段超越的指令实例:

    MOV AX,[2000H];AX←DS:[2000H]

    ;从默认的DS数据段取出数据

  • 采用段超越前缀的指令实例:

    MOV AX,ES:[2000H];AX←ES:[2000H]

    ;从指定的ES附加段取出数据

总结


16 3770283

第2章:段寄存器的使用规定


16 3770283

第2章:寄存器的总结

内部图

  • 8088有8个8位通用寄存器、8个16位通用寄存器

  • 8088有6个状态标志和3个控制标志

  • 8088将1MB存储空间分段管理,有4个段寄存器,对应4种逻辑段

  • 8088有4个段超越前缀指令,用于明确指定数据所在的逻辑段

  • 熟悉上述内容后,就可以进入下节


16 3770283

第2章

指令系统


2 2 2 8088 8086

第2章:2.2 8088/8086的寻址方式

  • 从8088/8086的指令格式入手,论述:

    • 立即数寻址方式

    • 寄存器寻址方式

    • 存储器寻址方式

  • 进而熟悉8088/8086汇编语言指令格式,尤其是其中操作数的表达方法

  • 为展开8088/8086指令系统做好准备


16 3770283

操作码

操作数

指令由操作码和操作数两部分组成

第2章:指令的组成

  • 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分

  • 操作数是指令执行的参与者,即各种操作的对象

  • 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数


16 3770283

第2章:指令的助记符格式

操作码 操作数1,操作数2;注释

  • 操作数2,常被称为源操作数src,它表示参与指令操作的一个对象

  • 操作数1,成被称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果

  • 分号后的内容是对指令的解释

汇编语句格式


16 3770283

第2章:指令的操作码和操作数

  • 每种指令的操作码:

    • 用一个助记符表示(指令功能的英文缩写)

    • 对应着机器指令的一个或多个二进制编码

  • 指令中的操作数:

    • 可以是一个具体的数值

    • 可以是存放数据的寄存器

    • 或指明数据在主存位置的存储器地址


16 3770283

第2章:操作数的寻址方式

  • 指令系统设计了多种操作数的来源

  • 寻找操作数的过程就是操作数的寻址

  • 把寻找操作数的方式叫做(操作数)寻址方式

  • 理解操作数的寻址方式是理解指令功能的前提

  • 操作数采取哪一种寻址方式

    • 一方面,会影响处理器执行指令的速度和效率

    • 另一方面,对程序设计也很重要

MOV指令


2 2 2 1

第2章:2.2.1 立即数寻址方式

  • 指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)

  • 这种操作数被称为立即数imm

    • 可以是8位数值i8(00H~FFH)

    • 也可以是16位数值i16(0000H~FFFFH)

  • 立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现

MOV AX, 0102H;AX←0102H

演示


2 2 2 2

第2章:2.2.2 寄存器寻址方式

  • 操作数存放在CPU的内部寄存器reg中:

    • 8位寄存器r8:

      AH、AL、BH、BL、CH、CL、DH、DL

    • 16位寄存器r16:

      AX、BX、CX、DX、SI、DI、BP、SP

    • 4个段寄存器seg:

      CS、DS、SS、ES

  • 寄存器名表示其内容(操作数)

MOV AX, BX;AX←BX

演示


2 2 2 3

第2章: 2.2.3 存储器寻址方式

  • 操作数在主存储器中,用主存地址表示

  • 程序设计时,8088采用逻辑地址表示主存地址

    • 段地址在默认的或用段超越前缀指定的段寄存器中

    • 指令中只需给出操作数的偏移地址(有效地址EA)

  • 8086设计了多种存储器寻址方式

    1、直接寻址方式

    2、寄存器间接寻址方式

    3、寄存器相对寻址方式

    4、基址变址寻址方式

    5、相对基址变址寻址方式


16 3770283

第2章:1. 直接寻址方式

  • 直接寻址方式的有效地址在指令中直接给出

  • 默认的段地址在DS段寄存器,可使用段超越前缀改变

  • 用中括号包含有效地址,表达存储单元的内容

MOV AX, [2000H];AX←DS:[2000H]

演示

MOV AX, ES: [2000H];AX←ES:[2000H]


16 3770283

第2章:2. 寄存器间接寻址方式

  • 有效地址存放在基址寄存器BX或变址寄存器SI、DI中

  • 默认的段地址在DS段寄存器,可使用段超越前缀改变

MOV AX, [BX];AX←DS:[BX]

演示


16 3770283

第2章:3. 寄存器相对寻址方式

  • 有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI

    有效地址=BX/BP/SI/DI+8/16位位移量

  • 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变

MOV AX, [SI+06H];AX←DS:[SI+06H]

演示

MOV AX, 06H[SI];AX←DS:[SI+06H]


16 3770283

第2章:4. 基址变址寻址方式

  • 有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:

    有效地址=BX/BP+SI/DI

  • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变

MOV AX, [BX+SI];AX←DS:[BX+SI]

演示

MOV AX, [BX][SI];AX←DS:[BX+SI]


16 3770283

第2章:5. 相对基址变址寻址方式

  • 有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:

    有效地址=BX/BP+SI/DI+8/16位位移量

  • 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变

MOV AX, [BX+DI+6];AX←DS:[BX+DI+6]

演示

MOV AX, 6[BX+DI]

MOV AX, 6[BX][DI]


16 3770283

第2章:存储器寻址方式中的变量

  • 变量指示内存中的数据,变量名具有地址属性。存储器寻找方式中经常采用变量形式

  • 变量的定义

    WVAR DW 1234H

    ;定义16位变量WVAR,具有初值1234H

    ;假设其偏移地址为10H

  • 单独引用变量名是直接寻址方式

    MOV AX,WVAR ;指令功能:AX=1234H

    ;等同于 MOV AX,[0010H]

  • 相对寻址方式中,变量名表示其偏移地址,相当于位移量

    MOV AX, [DI+WVAR] ;= MOV AX,WVAR[DI]

    ;等同于 MOV AX,[DI+0010H]


16 3770283

第2章:相对寻址方式中的位移量

  • 在寄存器相对和相对基址变址寻址方式中,其位移量不仅可用常量表示,也可用符号表示

  • 这个符号可以是变量名,例如WVAR变量,而且支持多种表达形式

    MOV AX, [DI+WVAR] ;

    ;等同于 MOV AX, WVAR[DI]

    MOV AX,[BX+SI+WVAR]

    ;等同于 MOV AX, WVAR[BX+SI]

    ;等同于 MOV AX, WVAR[BX][SI]


16 3770283

第2章:操作数的表达符号(1)


16 3770283

第2章:操作数的表达符号(2)

  • 掌握操作数的寻址方式后,进入指令学习


16 3770283

第2章

指令系统


2 2 3

第2章:2.3 数据传送类指令

  • 数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令

  • 传送指令把数据从一个位置传送到另一个位置

  • 除标志寄存器传送指令外,均不影响标志位

  • 重点掌握

    MOV XCHG XLAT PUSH POP LEA


2 2 3 1

MOV

XCHG

XLAT

第2章: 2.3.1 通用数据传送指令

  • 提供方便灵活的通用传送操作

  • 有3条指令

    通用数据传送MOV

    数据交换XCHG

    AL与字节表间数据传送XLAT


2 1 mov move

第2章:1. 传送指令MOV(move)

  • 把一个字节或字的操作数从源地址传送至目的地址

MOV reg/mem,imm;立即数送寄存器或主存

MOV reg/mem/seg,reg;寄存器送(段)寄存器或主存

MOV reg/seg,mem;主存送(段)寄存器

MOV reg/mem,seg;段寄存器送寄存器或主存

演示

MOV指令传送功能图解


2 mov

以字母开头的常数要有前导0

第2章:MOV指令--立即数传送

MOV reg/mem,imm;立即数送寄存器或主存

mov cl,4;cl←4,字节传送

mov dx,0ffh;dx←00ffh,字传送

mov si,200h;si←0200h,字传送

mov bvar,0ah;字节传送

;假设bvar是一个字节变量,定义如下:bvar db 0

mov wvar,0bh;字传送

;假设wvar是一个字变量,定义如下:wvar dw 0

  • 明确指令是字节操作还是字操作


2 mov1

第2章:MOV指令--寄存器传送

MOV reg/mem/seg,reg;寄存器送(段)寄存器或主存

mov ah,al;ah←al,字节传送

mov bvar,ch;bvar←ch ,字节传送

mov ax,bx;ax←bx,字传送

mov ds,ax;ds←ax,字传送

mov [bx],al;[bx]←al,字节传送

  • 寄存器具有明确的字节和字类型


2 mov2

第2章:MOV指令--存储器传送

MOV reg/seg,mem;主存送(段)寄存器

mov al,[bx];al←ds:[bx]

mov dx,[bp];dx←ss:[bp+0]

mov dx,[bp+4];dx←ss:[bp+4]

mov es,[si];es←ds:[si]

  • 不存在存储器向存储器的传送指令


2 mov3

第2章:MOV指令--段寄存器传送

MOV reg/mem,seg;段寄存器送寄存器或主存

mov [si],ds

mov ax,ds;ax←ds

mov es,ax;es←ax←ds

  • 对段寄存器的操作不灵活


2 mov4

立即数

通用寄存器

AX BX CX DX

BP SP SI DI

段寄存器

DS ES SS

第2章:MOV指令传送功能图解

MOV指令也并非任意传送!

非法指令的主要现象:

两个操作数的类型不一致

无法确定是字节量还是字量操作

CS

两个操作数都是存储器

段寄存器的操作有一些限制


16 3770283

第2章:非法指令--两个操作数类型不一致

  • 在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令

    MOV AL, 050AH;非法指令,修正:

    ;mov ax,050ah

    MOV SI, DL;非法指令,修正:

    ;mov dh,0

    ;mov si,dx


16 3770283

第2章:非法指令--无法确定是字节量还是字量操作

  • 当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明

    MOV [BX+SI], 255;非法指令,修正:

    ;mov byte ptr [bx+si],255

    ;byte ptr 说明是字节操作

    ;mov word ptr [bx+si],255

    ;word ptr 说明是字操作


16 3770283

第2章:非法指令--两个操作数都是存储器

  • 8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数)

    MOV buf2, buf1;非法指令,修正:

    ;假设buf2和buf1是两个字变量

    ;mov ax,buf1

    ;mov buf2,ax

    ;假设buf2和buf1是两个字节变量

    ;mov al,buf1

    ;mov buf2,al


16 3770283

第2章:非法指令--段寄存器的操作有一些限制

  • 8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活

    MOV DS, ES;非法指令,修正:

    ;mov ax,es

    ;mov ds,ax

    MOV DS, 100H;非法指令,修正:

    ;mov ax,100h

    ;mov ds,ax

    MOV CS, [SI];非法指令

    ;指令存在,但不能执行


2 2 xchg exchange

第2章:2. 交换指令XCHG(exchange)

  • 把两个地方的数据进行互换

XCHG reg,reg/mem

;reg  reg/mem

演示

  • 寄存器与寄存器之间对换数据

  • 寄存器与存储器之间对换数据

  • 不能在存储器与存储器之间对换数据


2 2 2

第2章:例2.2 数据交换

mov ax,1199h;ax=1199h

xchg ah,al;ax=9911h

;等同于 xchg al,ah

mov wvar,5566h;wvar是一个字量变量

xchg ax,wvar;ax=5566h,wvar=9911h

;等同于 xchg wvar,ax

xchg al,byte ptr wvar+1

;ax=5599h,wvar=6611h

;“byte ptr wvar+1”强制为字节量,只取高字节与AL类型交换,否则数据类型不匹配


2 3 xlat translate

第2章:3. 换码指令XLAT(translate)

  • 将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL

演示

XLAT;al←ds:[bx+al]

  • 换码指令执行前:

    在主存建立一个字节量表格,内含要转换成的目的代码

    表格首地址存放于BX,AL存放相对表格首地址的位移量

  • 换码指令执行后:

    将AL寄存器的内容转换为目标代码


2 2 3 2

第2章:2.3.2 堆栈操作指令

  • 堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址

  • 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定

  • 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP

图示


2 push

第2章:进栈指令PUSH

  • 进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部

演示

PUSH r16/m16/seg

;SP←SP-2

;SS:[SP]←r16/m16/seg

push ax

push [2000h]


2 pop

第2章:出栈指令POP

  • 出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2

POP r16/m16/seg

; r16/m16/seg←SS:[SP]

;SP←SP+2

演示

pop ax

pop wvar


16 3770283

第2章:堆栈操作的特点

  • 堆栈操作的单位是字,进栈和出栈只对字量

  • 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节

  • 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据

  • 堆栈段是程序中不可或缺的一个内存区,常用来

    • 临时存放数据

    • 传递参数

    • 保存和恢复寄存器


2 2 3 3

15 12

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

第2章:2.3.3 标志操作指令

1. 标志位操作指令

CLC;复位进位标志:CF←0

STC;置位进位标志:CF←1

CMC;求反进位标志:CF←~CF

CLD;复位方向标志:DF←0

STD;置位方向标志:DF←1

CLI;复位中断标志:IF←0

STI;置位中断标志:IF←1

2. 标志寄存器低字节与AH的传送指令

3. 标志寄存器出入堆栈指令


2 3 3

2.3.3 标志寄存器传送指令

  • 标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作

  • 有2对4条指令

    • 低8位传送:LAHF和SAHF

    • 16位传送:PUSHF和POPF


16 3770283

LAHF

;AH←FLAGS的低字节

LAHF指令将标志寄存器的低字节送寄存器AH

SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意

SAHF

;FLAGS的低字节←AH

SAHF将AH寄存器内容送FLAGS的低字节

用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

第 2 章

15 12

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

标志低字节进出AH指令


16 3770283

PUSHF

;SP←SP-2

;SS:[SP]←FLAGS

PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2

POPF

;FLAGS←SS:[SP]

;SP←SP+2

POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2

第 2 章

标志寄存器进出堆栈指令

例题


2 3 4

2.3.4 地址传送指令

  • 地址传送指令将存储器单元的逻辑地址送至指定的寄存器

    • 有效地址传送指令 LEA

    • 指针传送指令 LDS和LES

  • 注意不是获取存储器单元的内容


Lea load ea

有效地址传送指令LEA(load EA)

LEA

  • 将存储器操作数的有效地址传送至指定的16位寄存器中

LEA r16,mem

;r16←mem的有效地址EA

例题


16 3770283

LDS r16,mem

;r16←mem,

;DS←mem+2

LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器

LES r16,mem

;r16←mem,

;ES←mem+2

LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器

第 2 章

指针传送指令

例题


2 3 5

2.3.5 输入输出指令

  • 8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址

  • 8086用于寻址外设端口的地址线为16条,端口最多为216=65536(64K)个,端口号为0000H~FFFFH

  • 每个端口用于传送一个字节的外设数据


16 3770283

输入输出寻址方式

  • 8086的端口有64K个,无需分段,设计有两种寻址方式

  • 直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号

  • 间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号

  • 对大于FFH的端口只能采用间接寻址方式


16 3770283

输入指令IN

IN

  • 将外设数据传送给CPU内的AL/AX

IN AL,i8

;字节输入:AL←I/O端口(i8直接寻址)

IN AL,DX

;字节输入:AL←I/O端口(DX间接寻址)

IN AX,i8

;字输入:AX←I/O端口(i8直接寻址)

IN AX,DX

;字输入:AX←I/O端口(DX间接寻址)

例题


16 3770283

输出指令OUT

OUT

  • 将CPU内的AL/AX数据传送给外设

OUT i8,AL

;字节输出:I/O端口←AL(i8直接寻址)

OUT DX,AL

;字节输出:I/O端口←AL(DX间接寻址)

OUT i8,AX

;字输出:I/O端口←AX(i8直接寻址)

OUT DX,AX

;字输出:I/O端口←AX(DX间接寻址)

例题


16 3770283

第2章

指令系统


2 2 4

第2章:2.4 算术运算类指令

  • 算术运算类指令用来执行二进制的算术运算:加减乘除。

  • 这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志

  • 重点掌握

    加法指令:ADD、ADC、INC

    减法指令:SUB 、SBB、DEC、CMP、NEG


2 2 4 1

第2章:2.4.1 加法和减法指令

  • 加法指令:ADD, ADC和INC

  • 减法指令:SUB, SBB, DEC, NEG和CMP

  • 他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位

  • 操作数组合:

    运算指令助记符 reg, imm/reg/mem

    运算指令助记符 mem, imm/reg


16 3770283

第2章:1. 加和减指令

ADDdest,src

;加法:dest←dest+src

;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数

SUBdest,src

;减法:dest←dest-src

;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数


2 2 7

第2章:例题2.7 加法

mov ax,7348h;AX=7348H

add al,27h

;AL=48H+27H=6FH,AX=736FH

;OF=0,SF=0,ZF=0,PF=1,CF=0

add ax,3fffh

;AX=736FH+3FFFH=B36EH

;OF=1,SF=1,ZF=0,PF=0,CF=0


2 2 71

第2章:例题2.7 减法

sub ah,0f0h

;AH=B3H-F0H=C3H,AX=C36EH

;OF=0,SF=1,ZF=0,PF=1,CF=1

mov word ptr[200h],0ef00h

;[200H]=EF00H,标志不变

sub [200h],ax

;[200H]=EF00H-C36EH=2B92H

;OF=0,SF=0,ZF=0,PF=0,CF=0

sub si,si;SI=0

;OF=0,SF=0,ZF=1,PF=1,CF=0


16 3770283

第2章:2. 带进位加和减指令

ADCdest,src

;加法:dest←dest+src+CF

;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数

SBBdest,src

;减法:dest←dest-src-CF

;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数


2 3 cmp compare

第2章:3. 比较指令CMP(compare)

CMPdest,src

;做减法运算:dest-src

;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数

  • 比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系

cmp ax,bx

cmp al,100


16 3770283

第2章:4. 增量和减量指令

INCreg/mem

;增量(加1):reg/mem←reg/mem+1

DECreg/mem

;减量(减1):reg/mem←reg/mem-1

  • INC指令和DEC指令是单操作数指令

  • 与加法和减法指令实现的加1和减1不同的是:INC和DEC不影响CF标志

inc si;si←si+1

dec byte ptr [si];[si]←[si]-1


2 5 neg negtive

第2章:5. 求补指令NEG(negtive)

NEG reg/mem

;reg/mem←0-reg/mem

  • NEG指令对操作数执行求补运算,即用零减去操作数,然后结果返回操作数

  • 求补运算也可以表达成:将操作数按位取反后加1

  • NEG指令对标志的影响与用零作减法的SUB指令一样

  • NEG指令也是一个单操作数指令


2 2 4 3

第2章:2.4.3 乘法和除法指令

  • 乘法指令分无符号和有符号乘法指令

    MUL reg/mem;无符号乘法

    IMUL reg/mem;有符号乘法

  • 除法指令分无符号和有符号除法指令

    DIV reg/mem;无符号除法

    IDIV reg/mem;有符号除法


2 2 5

第2章:2.5 位操作类指令

  • 位操作类指令以二进制位为基本单位进行数据的操作

  • 当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令

  • 注意这些指令对标志位的影响

    1. 逻辑运算指令

    AND OR XOR NOT TEST

    2. 移位指令

    SHL SHR SAR

    3. 循环移位指令

    ROL ROR RCL RCR


2 2 5 1

第2章:2.5.1 逻辑运算指令

  • 双操作数逻辑指令AND、OR、XOR和TEST设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义;它们的操作数组合与ADD、SUB等一样:

    运算指令助记符 reg, imm/reg/mem

    运算指令助记符 mem, imm/reg

  • 单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:

    NOT reg/mem


2 and

第2章:逻辑与指令AND

对两个操作数执行逻辑与运算,结果送目的操作数

AND dest,src;dest←dest∧src

  • 只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0


16 3770283

第2章:逻辑或指令OR

对两个操作数执行逻辑或运算,结果送目的操作数

OR dest,src;dest←dest∨src

  • 只要相“或”的两位有一位是1,结果就是1;否则,结果为0


2 xor

第2章:逻辑异或指令XOR

对两个操作数执行逻辑异或运算,结果送目的操作数

XOR dest,src;dest←dest⊕src

  • 只有相“异或”的两位不相同,结果才是1;否则,结果为0


2 test

第2章:测试指令TEST

  • 对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志

TEST dest,src;dest∧src

  • AND与TEST指令的关系,

    同SUB与CMP指令的关系一样


2 not

第2章:逻辑非指令NOT

对一个操作数执行逻辑非运算

NOT reg/mem;reg/mem←~reg/mem

  • 按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”


2 2 6

第2章:例2.6 逻辑运算

mov al,75h;AL=75H

and al,32h;AL=30H

;CF=OF=0, SF=0,ZF=0,PF=1

or al,71h;AL=71H

;CF=OF=0,SF=0,ZF=0,PF=1

xor al,0f1h;AL=80H

;CF=OF=0,SF=1,ZF=0,PF=0

not al;AL=7FH,标志不变


2 2 17

第2章: 例2.17 逻辑运算指令的应用

and bl,11110110b

;BL中D0和D3清0,其余位不变

or bl,00001001b

;BL中D0和D3置1,其余位不变

xor bl,00001001b

;BL中D0和D3求反,其余位不变

  • AND指令可用于复位某些位(同0相与),不影响其他位

  • OR指令可用于置位某些位(同1相或),不影响其他位

  • XOR指令可用于求反某些位(同1相异或),不影响其他位


2 2 5 2

第2章:2.5.2 移位指令

  • 将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作

  • 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:

    • 该操作数为1,表示移动一位

    • 该操作数为CL,CL寄存器值表示移位位数 (移位位数大于1只能CL表示)

  • 按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF


2 shl

第2章:逻辑左移指令SHL

演示

SHL reg/mem,1/CL

;reg/mem左移1或CL位

;最低位补0,最高位进入CF


2 shr

第2章:逻辑右移指令SHR

演示

SHR reg/mem,1/CL

;reg/mem右移1/CL位

;最高位补0,最低位进入CF


2 sal

第2章:算术左移指令SAL

演示

SAL reg/mem,1/CL

;与SHL是同一条指令


2 sar

第2章:算术右移指令SAR

演示

SAR reg/mem,1/CL

;reg/mem右移1/CL位

;最高位不变,最低位进入CF


2 2 18

第2章:例2.18 数据移位

mov dx,6075h;DX=01100000 01110101B

shl dx,1;DX=11000000 11101010B

;CF=0,SF=1、ZF=0、PF=0

sar dx,1;DX=11100000 01110101B

;CF=0,SF=1、ZF=0、PF=0

shr dx,1;DX=01110000 00111010B

;CF=1,SF=0、ZF=0、PF=1

mov cl,4;CL=4,标志不变

sar dx,cl;DX=00000111 00000011B

;CF=1,SF=0、ZF=0、PF=1


2 2 19 al 10

sub ah,ah

and ah,0

第2章:例2.19 将AL寄存器中的无符号数乘以10

xor ah,ah;实现AH=0,同时使CF=0

shl ax,1;AX←2×AL

mov bx,ax;BX←AX=2×AL

shl ax,1;AX←4×AL

shl ax,1;AX←8×AL

add ax,bx;AX←8×AL+2×AL=10×AL

  • 逻辑左移一位相当于无符号数乘以2

  • 逻辑右移一位相当于无符号数除以2


2 2 5 3

第2章:2.5.3 循环移位指令

  • 循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为:

    ROLreg/mem,1/CL;不带进位循环左移

    RORreg/mem,1/CL;不带进位循环右移

    RCLreg/mem,1/CL;带进位循环左移

    RCR reg/mem,1/CL;带进位循环右移

  • 循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志

演示

演示

演示

演示


16 3770283

AX

DX

CF

0

第2章:32位数据移位

考虑32位数据的右移等操作

;将DX.AX中32位数值左移一位

shl ax,1

rcl dx,1


  • Login