微机
第一章 PC机软硬件系统
1.1 计算机系统概述
-
硬件组成
-
中央处理单位
- 包括运算器、控制器和寄存器组
- 运算器执行所有的算术和逻辑运算
- 控制器复制取指,译码和执行指令
- 汇编语言程序要使用寄存器
-
寄存器(Register)
- 是CPU内部的高速存储单元
- 它们为处理器提供各种操作所需要的数据或地址等信息
-
存储器(Memory)
- 计算机的记忆部分
- 汇编语言程序员主要关心主存地址
-
存储器地址(Address)
- 存储器地址是存储单元的编号
- 每个存储单元存放一个字节量的数据
- 存储容量指存储器所具有的存储单元个数
- 采用十六进制数来表达地址
-
总线
- 总线(BUS)是在计算机各部分之间进行数据传送的一组信号线
- 数据总线、控制总线、地址总线
- CPU通过总线与存储器和外设连接
-
地址总线
- 一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N。
- 这样的CPU最多可以寻找2的N次方个内存单元。
-
数据总线
- CPU与内存或其它器件之间的数据传送是通过数据总线来进行的。
- 数据总线的宽度决定了CPU和外界的数据传送速度。
- 8位数据总线上传送的信息
- 16位数据总线上传送的信息
-
控制总线
- CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。
- 有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。 所以,控制总线的宽度决定了CPU对外部器件的控制能力。
- 控制总线上发送的控制信息
- 前面所讲的内存读或写命令是由几根控制线综合发出的:
- 其中有一根名为读信号输出控制线负责由CPU 向外传送读信号,CPU 向该控制线上输出低电平表示将要读取数据;
- 有一根名为写信号输出控制线负责由CPU向外传送写信号。
-
外部设备(外设)
- 实现人机交互和机器间通讯的机电设备,简称外设
- 输入设备:键盘、鼠标器
- 输出设备:显示器、打印机
- 外设通过输入输出接口电路(接口卡)与系统连接
- 汇编语言程序中对接口电路中的端口进行操作
- 实现人机交互和机器间通讯的机电设备,简称外设
-
接口卡
- CPU对外部设备不能直接控制,如显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。
-
端口(Port)
- I/O接口电路由接口寄存器组成,需要用编号区别各个寄存器:编号=地址
- I/O地址是接口电路中寄存器的编号
- 端口是I/O地址的通俗说法
- 系统通过这些端口与外设进行通信
- 采用十六进制数来表达端口
- Intel 8086支持64K个8位端口
- I/O地址可以表示为:0000H ~ FFFFH
-
汇编语言程序员看到的硬件
- 中央处理单元 CPU(Intel 80x86)
- 对汇编语言程序员,最关心其中的寄存器
- 存储器(主存储器)
- 呈现给汇编语言程序员的,是存储器地址
- 外部设备(接口电路)
- 汇编语言程序员看到的是端口(I/O地址)
- 中央处理单元 CPU(Intel 80x86)
-
CPU对存储器的读写
- 必须和外部器件(标准的说法是芯片)进行三类信息的交互:
- 存储单元的地址(地址信息)
- 器件的选择,读或写命令(控制信息)
- 读或写的数据(数据信息)
- 必须和外部器件(标准的说法是芯片)进行三类信息的交互:
-
计算机的软件
- 系统软件
- 操作系统
- 汇编程序和编译程序
- 应用软件
- 文本编辑软件
- 软件开发工具(包)
- 系统软件
1.2 认识汇编语言
-
计算机的程序设计语言
-
机器语言(Machine Language)
- B8 64 00 05 00 01
-
汇编语言(Assembly Language)
- mov ax,100
;取得一个数据100(MOV是传送指令)
add ax,256
;实现100+256(ADD是加法指令)
- mov ax,100
-
高级语言(High-level Language)
- 100+256
-
-
什么是汇编语言
- 以助记符形式表示计算机指令
- 助记符(mnemonic)是便于人们记忆、并能描述指令功能和指令操作数的符号
- 助记符是表明指令功能的英语单词或其缩写
- 汇编格式指令以及使用它们编写程序的规则就形成汇编语言(Assembly Language)
- 汇编语言程序:用汇编语言书写的程序
- 汇编程序:将汇编语言程序“汇编”成机器代码目标模块的程序
- 以助记符形式表示计算机指令
-
汇编语言的特点
- 汇编语言的优点:
- 直接控制计算机硬件部件
- 编写“时间”和“空间”两方面最有效程序
- 汇编语言的缺点:
- 与处理器密切有关
- 需要熟悉计算机硬件系统、考虑许多细节
- 编写繁琐,调试、维护、交流和移植困难
- 汇编语言的优点:
-
8086
- 16位结构的微处理器:数据总线为16位
- 主存容量1MB:地址总线为20位
- 时钟频率5MHz(IBM PC使用4.77MHz)
- 准16位微处理器8088:外部数据总线为8位
- IBM PC和PC/XT机使用Intel 8088 CPU
- 8086的16位指令系统:Intel 80x86基本指令集
- 80186/80188的核心是8086/8088,配以支持电路
- 80186/80188指令系统比8086指令系统新增了若干条实用的指令
- 涉及堆栈操作、移位指令、输入输出指令、过程指令和边界检测及乘法指令
-
PC机中各类存储器的逻辑连接情况
-
主存地址空间
- 都和CPU的总线相连。
- CPU对它们进行读或写的时候都通过控制线发出主存读写命令。
- 将各类存储器看作一个逻辑存储器
- 所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器;
- 每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间;
- CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
- 假设,上图中的主存空间地址段分配如下:
- 地址0~7FFFH的32KB空间为主随机存储器的地址空间;
- 地址8000H~9FFFH的8KB空间为显存地址空间;
- 地址A000H~FFFFH的24KB空间为各个ROM的地址空间。
- 最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU角度考虑问题。
- 对CPU来讲,系统中的所有物理存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的主存地址空间。
- 主存空间的分配示意图
-
PC机最低1MB主存
- 系统RAM区
- 地址最低端的640KB空间
- 由DOS进行管理
- 显示RAM区
- 128KB主存空间保留给显示缓冲存储区
- 显示RAM区并没有被完全使用
- 扩展ROM区
- I/O接口电路卡上的ROM
- 系统ROM区
- ROM-BIOS程序
- 系统RAM区
-
8086PC机的主存地址空间分配示意图
-
微机的软件
- 系统软件:DOS平台
- MS-DOS 6.22实地址方式
- Windows的MS-DOS模拟环境
- 应用软件:开发汇编语言程序涉及
- 文本编辑器
- 汇编程序
- 连接程序
- 调试程序
- 集成化开发环境
- 本教材提供
- DOS-MASM615.EXE
- 系统软件:DOS平台
-
文本编辑器(Editor)
- 文本编辑器用于编辑无任何格式的文档
- 程序设计要采用文本编辑器编写源程序
- 常见的文本编辑软件有很多,如
- MS-DOS的EDIT全屏幕编辑器
- Windows的Notepad计事本
- 程序开发系统中的程序编辑器
- Turbo C
- Visual Studio
- MASM的PWB
-
汇编程序(Assembler)
- 汇编程序将汇编语言源程序翻译(称为“汇编”)成机器代码目标模块
- 本课程采用微软的MASM 6.15
- MASM的最后一个独立版本MASM 6.11
- 可免费升级为MASM 6.14(支持SSE)
- Visual C++中有MASM 6.15(支持SSE2)
- Visual C++.NET 2003有MASM 7.10
- Visual C++.NET 2005的MASM支持Penium 4的SSE3指令系统,同时有ML64.EXE程序用于支持64位指令系统
-
连接程序(Linker)
- 连接程序将汇编后的目标模块转换为可执行程序
- 每个程序开发环境都有连接程序
- 连接程序的文件名通常是:LINK.EXE
- 32位Windows连接程序不同于16位DOS连接程序
-
调试程序(Debugger)
- 调试程序进行程序排错、分析等
- 本课程采用MASM的CodeView
- DOS的DEBUG程序
- 还有Turbo Debugger等
-
集成化开发环境(IDE)
- 进行程序设计使用的各种软件的有机集合,有文本编辑器,有语言翻译程序,有连接程序,还组合有调试程序等
- 大型的程序设计项目往往要借助这种集成开发环境,也就是软件开发工具(包)
- MASM提供程序员工作平台PWB
- 微软的Visual Studio开发系统
-
MASM编程环境的使用
- 进入模拟DOS环境
- 将MASM目录作为当前目录
- 开发汇编语言程序
- ml /Fl filename.asm
- 运行可执行程序
- 调试可执行程序
- 定制进入MASM快捷方式 ML615
- 创建快速开发文件 MLL.BAT
- 构造方便的调试环境 CV.BAT
-
8086微处理器(CPU)
-
微处理器是微机的硬件核心,主要包含指令执行的运算和控制部件,还有多种寄存器
-
对程序员来说,微处理器抽象为以名称存取的寄存器
-
8086内部结构有两个功能模块,完成一条指令的取指和执行功能
-
总线接口单元BIU:负责读取指令和操作数
-
执行单元EU :负责指令译码和执行
-
8086的内部结构
-
传统微处理器的指令执行过程
-
8086CPU的指令执行过程
-
1.3 基础是熟悉寄存器组
-
8086的寄存器组(背记)
-
8086的通用寄存器
- 8086的16位通用寄存器(14个)是:
- AX BX CX DX
- SI DI BP SP
- 其中前4个数据寄存器都还可以分成高8位和低8位两个独立的寄存器
- 8086的8位通用寄存器(8个)是:
- AH BH CH DH
- AL BL CL DL
- 对其中某8位的操作,并不影响另外对应8位的数据
- 8086的16位通用寄存器(14个)是:
-
数据寄存器
- 数据寄存器用来存放计算的结果和操作数,也可以存放地址
- 每个寄存器又有它们各自的专用目的
- AX--累加器,使用频度最高,用于算术、逻辑运算以及与外设传送信息等;
- BX--基址寄存器,常用做存放存储器地址;
- CX--计数器,作为循环和串操作等指令中的隐含计数器;
- DX--数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址。
-
变址及指针寄存器
- 变址寄存器常用于存储器寻址时提供地址
- SI是源变址寄存器
- DI是目的变址寄存器
- 指针寄存器用于寻址内存堆栈内的数据
- SP为堆栈指针寄存器,指示栈顶的偏移地址,不能再用于其他目的,具有专用目的
- BP为基址指针寄存器,表示数据在堆栈段中的基地址
- SI和DI在串操作指令有特殊用法
- SP和BP寄存器与SS段寄存器联合使用确定堆栈段中的存储单元地址
- 变址寄存器常用于存储器寻址时提供地址
-
堆栈(Stack)
- 堆栈是主存中一个特殊的区域
- 它采用先进后出FILO(First In Last Out)或后进先出LIFO(Last In First Out)的原则进行存取操作,而不是随机存取操作方式
- 可以用一个盒子和3本书来描述, 栈的操作方式:
- 入栈
- 出栈
- 堆栈通常由处理器自动维持
- 在8086中,由堆栈段寄存器SS和堆栈指针寄存器SP共同指示
-
指令指针IP
- 指令指针寄存器IP,指示代码段中指令的偏移地址
- 它与代码段寄存器CS联用,确定下一条指令的物理地址
- 计算机通过CS : IP寄存器来控制指令序列的执行流程
- IP寄存器是一个专用寄存器
-
标志寄存器
- 标志(Flag)用于反映指令执行结果或控制指令执行形式,形成16位标志寄存器FLAGS(程序状态字PSW寄存器)
- 状态标志--用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它
- CF ZF SF PF OF(1溢出) AF
- 控制标志--可由程序根据需要用指令设置,用于控制处理器执行指令的方式
- DF(读取数据方向位) IF(中断) TF
-
进位标志CF(Carry Flag)
- 当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。
- 3AH + 7CH=B6H,没有进位:CF = 0
- AAH + 7CH=(1)26H,有进位:CF = 1
- 当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。
-
零标志ZF(Zero Flag)
- 若运算结果为0,则ZF = 1;否则ZF = 0
- 注意:ZF为1表示的结果是0
- 3AH + 7CH=B6H,结果不是零:ZF = 0
- 84H + 7CH=(1)00H,结果是零:ZF = 1
-
符号标志SF(Sign Flag)
- 运算结果最高位为1,则SF = 1;否则SF = 0
- 有符号数据用最高有效位表示数据的符号,所以,最高有效位就是符号标志的状态
- 3AH + 7CH=B6H,最高位D7=1:SF = 1
- 84H + 7CH=(1)00H,最高位D7=0:SF = 0
-
奇偶标志PF(Parity Flag)
- 当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0
- PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作
- 3AH + 7CH=B6H=10110110B
- 结果中有5个1,是奇数:PF = 0
-
溢出标志OF(Overflow Flag)
- 若算术运算的结果有溢出,则OF=1;否则 OF=0
- 3AH + 7CH=B6H,产生溢出:OF = 1
- AAH + 7CH=(1)26H,没有溢出:OF = 0
- 若算术运算的结果有溢出,则OF=1;否则 OF=0
-
什么是溢出
- 处理器内部以补码表示有符号数
- 8位表达的整数范围是:+127~-128
- 16位表达的范围是:+32767~-32768
- 如果运算结果超出这个范围,就产生了溢出
- 有溢出,说明有符号数的运算结果不正确
- 3AH+7CH=B6H,就是58+124=182,已经超出-128~+127范围,产生溢出,故OF=1;另一方面,补码B6H表达真值是-74,显然运算结果也不正确
-
溢出和进位
- 溢出标志OF和进位标志CF是两个意义不同的标志
- 进位标志表示无符号数运算结果是否超出范围,超出范围后加上进位或借位运算结果仍然正确;
- 溢出标志表示有符号数运算结果是否超出范围,超出范围后运算结果不正确。
-
溢出和进位的对比
- 例1:3AH + 7CH=B6H
- 无符号数运算: 58+124=182
- 范围内,无进位
- 有符号数运算: 58+124=182
- 范围外,有溢出
- 例2:AAH + 7CH=(1)26H
- 无符号数运算: 170+124=294
- 范围外,有进位
- 有符号数运算: -86+124=28
- 范围内,无溢出
- 例1:3AH + 7CH=B6H
-
如何运用溢出和进位
- 处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF
- 应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出
-
溢出的判断
- 判断运算结果是否溢出的简单规则:
- 只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确
- 其他情况下,则不会产生溢出
-
辅助进位标志AF(Auxiliary Carry Flag)
- 运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。
- 这个标志主要由处理器内部使用,用于十进制算术运算调整指令中,用户一般不必关心
- 3AH + 7CH=B6H,D3有进位:AF = 1
-
方向标志DF(Direction Flag)
- 用于串操作指令,控制地址的变化方向:
- 设置DF=0,存储器地址自动增加;
- 设置DF=1,存储器地址自动减少。
- CLD指令复位方向标志:DF=0
- STD指令置位方向标志:DF=1
- 用于串操作指令,控制地址的变化方向:
-
中断允许标志IF(Interrupt-enable Flag)
- 用于控制外部可屏蔽中断是否可以被处理器响应:
- 设置IF=1,则允许中断;
- 设置IF=0,则禁止中断。
- CLI指令复位中断标志:IF=0
- STI指令置位中断标志:IF=1
- 用于控制外部可屏蔽中断是否可以被处理器响应:
-
陷阱标志TF(Trap Flag)
- 用于控制处理器进入单步操作方式:
- 设置TF=0,处理器正常工作;
- 设置TF=1,处理器单步执行指令。
- 单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断
- 这种内部中断称为单步中断
- 所以TF也称为单步标志
- 利用单步中断可对程序进行逐条指令的调试
- 这种逐条指令调试程序的方法就是单步调试
- 用于控制处理器进入单步操作方式:
-
数据信息的表达单位
- 计算机中信息的单位
- 二进制位Bit:存储一位二进制数:0或1
- 字节Byte:8个二进制位,D7~D0
- 字Word:16位,2个字节,D15~D0
- 双字DWord:32位,4个字节,D31~D0
- 最低有效位LSB:数据的最低位,D0位
- 最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31位
- 计算机中信息的单位
-
数据的存储格式
-
存储单元及其存储内容
- 主存储器需要利用地址区别
- 每个存储单元都有一个编号;被称为存储器地址
- 每个存储单元存放一个字节的内容
- 0002H单元存放有一个数据34H
- 表达为 [0002H]=34H
-
多字节数据存放方式
- 多字节数据在存储器中占连续的多个存储单元:
- 存放:低字节存入低地址,高字节存入高地址
- 表达:用低地址表示多字节数据占据的地址空间
- 80x86处理器采用“低对低、高对高”:小端方式Little Endian
- 2号“字”单元的内容为:
- [0002H] = 1234H
- 2号“双字”单元的内容为:
- [0002H] = 78561234H
-
数据的地址对齐
- 同一个存储器地址可以是字节单元地址、字单元地址、双字单元地址等等
- 字单元安排在偶地址(xxx0B)、双字单元安排在模4地址(xx00B)等,被称为“地址对齐(Align)”
- 对于不对齐地址的数据,处理器访问时,需要额外的访问存储器时间
- 应该将数据的地址对齐,以取得较高的存取速度
-
存储器的分段管理
- 8086 CPU有20条地址线
- 最大可寻址空间为220=1MB
- 物理地址范围从00000H~FFFFFH
- 8086CPU将1MB空间分成许多逻辑段(Segment)
- 每个段最大限制为64KB
- 段地址的低4位为0000B
- 这样,一个存储单元除具有一个唯一的物理地址外,还具有多个逻辑地址
- 8086 CPU有20条地址线
-
物理地址和逻辑地址
- 每个物理存储单元有一个唯一的20位编号,即物理地址:
- 00000H~FFFFFH
- 分段后用户编程时,采用逻辑地址:
- 段基地址 : 段内偏移地址
- : 分隔符
- 每个物理存储单元有一个唯一的20位编号,即物理地址:
-
逻辑地址
- 段地址说明逻辑段在主存中的起始位置
- 8086规定段地址必须是模16地址:xxxx0H
- 省略低4位0000B,段地址就可以用16位数据表示,就能用16位段寄存器表达段地址
- 偏移地址说明主存单元距离段起始位置的偏移量
- 每段不超过64KB,偏移地址也可用16位数据表示
-
物理地址和逻辑地址的转换
- 将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址
- 一个物理地址可以有多个逻辑地址
- 逻辑地址 1460:100、1380:F00
- 物理地址 14700H 14700H
-
段寄存器
- 8086有4个16位段寄存器,每个段寄存器确定一个逻辑段的起始地址,每种逻辑段均有各自的用途
- CS(Code Segment)
- 指明代码段的起始地址
- SS(Stack Segment)
- 指明堆栈段的起始地址
- DS(Data Segment)
- 指明数据段的起始地址
- ES(Extra Segment)
- 指明附加段的起始地址
-
代码段(Code Segment)
- 代码段用来存放程序的指令序列
- 代码段寄存器CS存放代码段的段地址
- 指令指针寄存器IP指示下条指令的偏移地址
- 处理器利用CS:IP取得下一条要执行的指令
- 代码段用来存放程序的指令序列
-
堆栈段(Stack Segment)
- 堆栈段确定堆栈所在的主存区域
- 堆栈段寄存器SS存放堆栈段的段地址
- 堆栈指针寄存器SP指示堆栈栈顶的偏移地址
- 处理器利用SS:SP操作堆栈顶的数据
- 堆栈段确定堆栈所在的主存区域
-
数据段(Data Segment)
- 数据段存放运行程序所用的数据
- 数据段寄存器DS存放数据段的段地址
- 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址
- .处理器利用DS:EA存取数据段中的数据
- 数据段存放运行程序所用的数据
-
附加段(Extra Segment)
- 附加段是附加的数据段,也用于数据的保存:
- 附加段寄存器ES存放附加段的段地址
- 各种主存寻址方式(有效地址EA)得到存储器中操作数的偏移地址
- 处理器利用ES:EA存取附加段中的数据
- 串操作指令将附加段作为其目的操作数的存放区域
- 附加段是附加的数据段,也用于数据的保存:
-
如何分配各个逻辑段
- 程序的指令序列必须安排在代码段
- 程序使用的堆栈一定在堆栈段
- 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段
- 数据的存放比较灵活,实际上可以存放在任何一种逻辑段中
-
段超越前缀指令
- 没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段
- 默认的情况允许改变,需要使用段超越前缀指令;8086指令系统中有4个:
- CS: ;代码段超越,使用代码段的数据
- SS: ;堆栈段超越,使用堆栈段的数据
- DS: ;数据段超越,使用数据段的数据
- ES: ;附加段超越,使用附加段的数据
-
段超越的示例
- 没有段超越的指令实例:
- MOV AX,[2000H] ;AX←DS:[2000H]
- ;从默认的DS数据段取出数据
- 采用段超越前缀的指令实例:
- MOV AX,ES:[2000H] ;AX←ES:[2000H]
- ;从指定的ES附加段取出数据
- 没有段超越的指令实例:
-
段寄存器的使用规定
-
存储器的分段
- 8086对逻辑段要求:
- 段地址低4位均为0
- 每段最大不超过64KB
- 8086对逻辑段并不要求:
- 必须是64KB
- 各段之间完全分开(即可以重叠(两个长度之间的长小于64K)——
- 8086对逻辑段要求:
-
各个逻辑段独立
-
各个逻辑段重叠
-
1MB空间的分段
- 1MB空间最多能分成多少个段?
- 每隔16个存储单元就可以开始一个段
- 所以1MB最多可以有:
- 220÷16=216=64K 个段
- 1MB空间最少能分成多少个段?
- 每隔64K个存储单元开始一个段
- 所以1MB最少可以有:
- 220÷216=16 个段
- 1MB空间最多能分成多少个段?
1.4 难点是各种寻址方式
-
指令的组成
1.
2. 指令由操作码和操作数两部分组成
3. 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分
4. 操作数是指令执行的参与者,即各种操作的对象
5. 有些指令不需要操作数,通常的指令都有一个或两个操作数,个别指令有3个甚至4个操作数 -
指令的操作码和操作数
- 每种指令的操作码:
- 用一个唯一的助记符表示(指令功能的英文缩写)
- 对应着机器指令的一个二进制编码
- 指令中的操作数:
- 可以是一个具体的数值(立即数)
- 可以是存放数据的寄存器(寄存器)例:AX
- 或指明数据在主存位置的存储器地址(存储器地址)例:【2000H】
- 每种指令的操作码:
-
8086的机器代码格式
-
8086指令长度为2~6字节,其格式如下图所示
-
指令各部分含义说明如下:
- ①操作特征部分
- 这部分位于指令代码的第一字节,由三个字段组成。
- OPCODE(操作码)字段
- 这个字段的代码规定指令的操作种类和两个操作数的来源。
- 表1给出了几条指令的操作码。指令中如果源操作数为立即数,则第二字节的寻址特征中REG字段作为辅助操作码。如表1中第4条ADD指令与第6条AND指令的OPCODE虽然相同,但二者辅助操作码不同。
- d(方向)字段
- 第二字节的寻址特征部分可以指出两个操作数:一个由REG字段确定,另一个由MOD和R/M字段确定。方向字段d用来指示源操作数和目的操作数分别由哪个字段确定。
- 当d=1时,表示目的操作数由REG字段确定,而源操作数则由MOD、R/M字段确定。
- 当d=0时,表示由MOD、R/M字段确定目的操作数,而由REG字段确定源操作数。
- 例如表1中,第1、3条指令的d字段为1,而第5条指令的d字段为0。
- W(字/字节)字段
- 当W=1时,表示两个操作数为字(16位);当W=0时,表示两个操作数为字节(8位)。
- ② 寻址特征部分
- 这部分位于指令代码的第二字节,用来表示两个操作数分别使用哪种寻址方式。它包括三个字段:MOD、REG和R/M,其中REG确定一个操作数,而MOD、R/M联合确定另一个操作数。
- REG(寄存器)字段
- 由REG字段确定的一个操作数必定是在某个通用寄存器中(即寄存器寻址方式)。REG字段与W字段配合,共有16种编码组合,每一种编码指定操作数存放的寄存器地址,而且指明是8位还是16位寄存器,如表2所示。
- 由REG字段确定的一个操作数必定是在某个通用寄存器中(即寄存器寻址方式)。REG字段与W字段配合,共有16种编码组合,每一种编码指定操作数存放的寄存器地址,而且指明是8位还是16位寄存器,如表2所示。
- MOD(寻址方式)字段与R/M(寄存器/存储器)字段
- 由这两个字段共同确定一个操作数。这个操作数或在某个寄存器(即寄存器寻址方式),或在存储单元中(即直接寻址、寄存器间接寻址、变址寻址、基址变址寻址方式中的一种)。如表3所示,MOD和R/M字段的编码确定一个操作数的寻址方式。
- 当MOD=11时,结合R/M和W字段编码,指明操作数在哪个寄存器。
- 当MOD≠11时,结合R/M给出计算存储器操作数有效地址EA的24种方法。
- ③ 立即数部分
- 如指令的源操作数为立即数,则将立即数安放于指令代码的第三、四字节。若是8位的立即数,则占1个字节;若是16位,就占2个字节。如指令的源操作数采用非立即寻址方式,那么指令代码中不需要这部分,此时,位移量可占据第三、四字节。
- ④ 位移量部分
- 由寻址特征中的MOD、R/M字段决定指令是否应有这部分。如表3所示,MOD、R/M确定有disp8,则有一个字节的位移量并位于指令代码的最后一个字节;如位移量为disp16,则位于指令代码的最后两个字节。如没有disp,则无位移量部分。
- ①操作特征部分
-
标准机器代码示例
1.
2. mov ax,[BP+0] ;机器代码是 8B 46 00
3. 前一个字节8B是操作码(含w=1表示字操作)
4. 中间一个字节46(01 000 110)是 “mod reg r/m”字节- reg=000表示目的操作数为AX
- mod=01和r/m=110表示源操作数为[BP+D8]
- 最后一个字节就是8位位移量〔D8=〕00
-
其它机器代码形式
1.
2. mov al,05 ;机器代码是B0 05- 前一个字节B0是操作码(含一个操作数AL),后一个字节05是立即数
- mov ax,0102H ;机器代码是B8 02 01
- 前一个字节B8是操作码(含一个操作数AX),后两个字节02 01是16位立即数(低字节02在低地址)
-
指令的助记符格式
- 操作码 操作数1,操作数2 ;注释
- 操作数2,称为源操作数 src,它表示参与指令操作的一个对象
- 操作数1,称为目的操作数 dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果
- 分号后的内容是对指令的解释
-
传送指令MOV的格式
- MOV dest,src ;dest←src
- 功能:将源操作数src传送至目的操作数dest
- MOV AL,05H ;AL←05H
- MOV BX,AX ;BX←AX
- MOV AX,[SI] ;AX←DS:[SI]
- MOV AX,[BP+06H] ;AX←SS:[BP+06H]
- MOV AX,[BX+SI] ;AX←DS:[BX+SI]
-
传送指令MOV的功能
-
直接寻址指令
-
寄存器操作的表达
-
立即数的表达
-
立即数寻址方式
- 指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)
- 这种操作数被称为立即数imm
- 它可以是8位数值i8(00H~FFH)
- 也可以是16位数值i16(0000H~FFFFH)
- 立即数寻址方式常用来给寄存器赋值
- MOV AL,05H ;AL←05H
- MOV AX,0102H ;AX←0102H
-
立即数寻址指令
- MOV AX,0102H ;AX←0102H
-
寄存器寻址方式
-
操作数存放在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,1234H ;AX←1234H
-
MOV BX,AX ;BX←AX
-
-
寄存器寻址指令
- MOV BX,AX ;BX←AX
-
存储器寻址方式
- 指令中给出操作数的主存地址信息(偏移地址,称之为有效地址EA),而段地址在默认的或用段超越前缀指定的段寄存器中
- 8086设计了多种存储器寻址方式
- 1、直接寻址方式
- 2、寄存器间接寻址方式
- 3、寄存器相对寻址方式
- 4、基址变址寻址方式
- 5、相对基址变址寻址方式
-
直接寻址方式
- 有效地址在指令中直接给出
- 默认的段地址在DS段寄存器,可使用段超越前缀改变
- MOV AX,[2000H]
- ;AX←DS:[2000H]
- ;指令代码:A1 00 20
- MOV AX,ES:[2000H]
- ;AX←ES:[2000H]
- ;指令代码:26 A1 00 20
-
直接寻址指令
- MOV AX,[2000H] ;AX←DS:[2000H]
-
寄存器间接寻址方式
- 有效地址存放在基址寄存器BX或变址寄存器SI、DI中,含有[]
- 默认的段地址在DS段寄存器,可使用段超越前缀改变
- MOV AX,[BX] ;AX←DS:[BX]
-
寄存器相对寻址方式
- 有效地址是寄存器内容与有符号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,[BP+06H] ;AX←SS:[BP+06H]
- 有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX/BP或SI/DI
-
基址变址寻址方式
- 有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:
- 有效地址=BX/BP+SI/DI
- 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀
- MOV AX,[BX+SI] ;AX←DS:[BX+SI]
- MOV AX,[BP+DI] ;AX←SS:[BP+DI]
- MOV AX,DS:[BP+DI] ;AX←DS:[BP+DI]
- 有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:
-
相对基址变址寻址方式
- 有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:
- 有效地址=BX/BP+SI/DI+8/16位位移量
- 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀
- MOV AX,[BX+DI+06H]
- ;AX←DS:[BX+DI+06H]
- 位移量可用符号表示
- 同一寻址方式有多种表达形式
- 有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:
-
寻址方式的多种表示方式
- 位移量可用符号表示:
- MOV AX,[SI+COUNT]
- ;COUNT是事先定义的变量或常量(就是数值)
- MOV AX,[BX+SI+WNUM] ;WNUM是变量或常量
- 同一寻址方式可以写成不同的形式:(3种)
- MOV AX,[BX][SI] ;MOV AX,[BX+SI]
- MOV AX,COUNT[SI] ;MOV AX,[SI+COUNT]
- MOV AX,WNUM[BX][SI]
- ;等同于 MOV AX,WNUM[BX+SI]
- ;等同于 MOV AX,[BX+SI+WNUM]
- 位移量可用符号表示:
-
寄存器操作数的表达
- r8——任意一个8位通用寄存器
- AH AL BH BL CH CL DH DL
- r16——任意一个16位通用寄存器
- AX BX CX DX SI DI BP SP
- reg——代表r8或r16
- seg——段寄存器
- CS DS ES SS
- r8——任意一个8位通用寄存器
-
存储器操作数的表达
- m8——一个8位存储器操作数单元(所有主存寻址方式)
- m16——一个16位存储器操作数单元(所有主存寻址方式)
- mem——代表m8或m16
-
立即数的表达
- i8——一个8位立即数
- i16——一个16位立即数
- imm——代表i8或i16
- dest——目的操作数
- src——源操作数