第 2 章教学重点第 2章是本课程的一个关键内容,是程序设计的基础
基础是熟悉寄存器组
难点是各种寻址方式
重点是掌握 8086常用指令的功能及应用第 2 章 什么是指令系统
计算机的指令系统就是指该计算机能够执行的全部指令的集合
每种计算机都有它支持的指令集合
16位 8086指令系统是 Intel 80x86
系列微处理器指令系统的基础一定要采用调试程序 DEBUG进行实践第 2 章 调试程序 DEBUG
DEBUG是常用的汇编语言级调试工具,
为汇编语言程序员提供了分析指令,
跟踪程序的有效手段
常用命令:
- A 汇编 - U 反汇编
- T 单步执行 - G 断点执行
- D 数据显示 - R 寄存器第 2 章 上机指导基本要求 ( 1)
1,调试各种寻址方式的 MOV指令
2,调试 例题 2.8,完成 习题 2.15
3,调试 例题 2.17,完成 习题 2.16
4,调试 例题 2.31,完成 习题 2.21
5,调试 例题 2.36和 2.39,完成 习题 2.26
6,调试 例题 2.47,完成 习题 2.39
7,调试 例题 2.49
第 2 章 上机指导基本要求 ( 2)
8,用命令行开发方式完成 例题 3.1
9,调试 例题 3.3,完成 习题 3.17
10,完成 习题 3.24,习题 3.25
11,调试 例题 4.4,完成 习题 4.12
12,调试 例题 4.7,完成 习题 4.24
13,调试 例题 4.10,完成 习题 4.34
14,调试 例题 4.13
15,完成 习题 4.57 详细说明参见,微服网,
第 2 章 2.1 8086的寄存器组
对程序员来说,8086内部结构 的最重要的是其寄存器组
8个通用寄存器
1个指令指针寄存器
1个标志寄存器
4个段寄存器第 2 章 2.1.1 8086的通用寄存器
8086的 16位通用寄存器是:
AX BX CX DX
SI DI BP SP
其中前 4个数据寄存器都还可以分成高
8位和低 8位两个独立的寄存器
8086的 8位通用寄存器是:
AH BH CH DH
AL BL CL DL
对其中某 8位的操作,并不影响另外对应 8位的数据第 2 章 数据寄存器
数据寄存器用来存放计算的结果和操作数,
也可以存放地址
每个寄存器又有它们各自的专用目的
AX--累加器,使用频度最高,用于算术,逻辑运算以及与外设传送信息等;
BX--基址寄存器,常用做存放存储器地址;
CX--计数器,作为循环和串操作等指令中的隐含计数器;
DX--数据寄存器,常用来存放双字长数据的高 16位,或存放外设端口地址 。
第 2 章 变址寄存器
变址寄存器常用于存储器寻址时提供地址
SI是源变址寄存器
DI是目的变址寄存器
串操作类指令中,SI和 DI具有特别的功能第 2 章 指针寄存器
指针寄存器用于寻址内存 堆栈 内的数据
SP为堆栈指针寄存器,指示栈顶的偏移地址
SP不能再用于其他目的,具有专用目的
BP为基址指针寄存器,表示数据在堆栈段中的基地址
SP和 BP寄存器与 SS段寄存器联合使用以确定堆栈段中的存储单元地址第 2 章 指令指针 IP
指令指针寄存器 IP,指示代码段中指令的偏移地址
它与代码段寄存器 CS联用,确定下一条指令的物理地址
计算机通过 CS,IP寄存器来控制指令序列的执行流程
IP寄存器是一个专用寄存器第 2 章 2.1.2 标志寄存器
标志 ( Flag) 用于反映指令执行结果或控制指令执行形式
8086处理器的各种标志形成了一个 16位的标志寄存器 FLAGS( 程序状态字 PSW寄存器 )
OF
1115 12
DF
10
IF
9
TF
8
SF
7
ZF
6 5
AF
4 3
PF
2 1
CF
0
程序设计需要利用标志的状态第 2 章 标志的分类
状态标志--用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它
CF ZF SF PF OF AF
控制标志--可由程序根据需要用指令设置,用于控制处理器执行指令的方式
DF IF TF
第 2 章 进位标志 CF( Carry Flag)
当运算结果的最高有效位有进位 ( 加法 ) 或借位 ( 减法 ) 时,进位标志置 1,
即 CF = 1;否则 CF = 0。
3AH + 7CH= B6H,没有进位,CF = 0
AAH + 7CH= ( 1) 26H,有进位,CF = 1
第 2 章 零标志 ZF( Zero Flag)
若运算结果为 0,则 ZF = 1;
否则 ZF = 0
3AH + 7CH= B6H,结果不是零,ZF = 0
84H + 7CH= ( 1) 00H,结果是零,ZF = 1
注意,ZF为 1表示的结果是 0
第 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)
当运算结果最低字节中,1”的个数为零或偶数时,PF = 1;否则 PF = 0
3AH + 7CH= B6H= 10110110B
结果中有 5个 1,是奇数,PF = 0
PF标志仅反映最低 8位中,1”的个数是偶或奇,即使是进行 16位字操作第 2 章 溢出标志 OF( Overflow Flag)
若算术运算的结果有溢出,
则 OF= 1;否则 OF= 0
3AH + 7CH= B6H,产生溢出,OF = 1
AAH + 7CH= ( 1) 26H,没有溢出,OF = 0
第 2 章 溢出标志 OF( Overflow Flag)
问题什么是溢出?
溢出和进位有什么区别?
处理器怎么处理,程序员如何运用?
如何判断是否溢出?
第 2 章 辅助进位标志 AF( Auxiliary Carry Flag)
3AH + 7CH= B6H,D3有进位,AF = 1
运算时 D3位 ( 低半字节 ) 有进位或借位时,AF = 1;否则 AF = 0。
这个标志主要由处理器内部使用,
用于十进制算术运算调整指令中,用户一般不必关心第 2 章 方向标志 DF( Direction Flag)
用于串操作指令中,控制地址的变化方向:
设置 DF= 0,存储器地址自动增加;
设置 DF= 1,存储器地址自动减少 。
CLD指令复位方向标志,DF= 0
STD指令置位方向标志,DF= 1
第 2 章 中断允许标志 IF( Interrupt-enableFlag)
用于控制外部可屏蔽中断是否可以被处理器响应:
设置 IF= 1,则允许中断;
设置 IF= 0,则禁止中断 。
CLI指令复位中断标志,IF= 0
STI指令置位中断标志,IF= 1
第 2 章 陷阱标志 TF( Trap Flag)
用于控制处理器进入单步操作方式:
设置 TF= 0,处理器正常工作;
设置 TF= 1,处理器单步执行指令 。
单步执行指令 —— 处理器在 每条指令执行结束 时,便产生一个编号为 1的内部中断
这种内部中断称为 单步中断
所以 TF也称为 单步标志
利用单步中断可对程序进行逐条指令的调试
这种逐条指令调试程序的方法就是 单步调试第 2 章 2.1.3 存储器组织与段寄存器
寄存器是微处理器内部暂存数据的存储单元,以名称表示
存储器则是微处理器外部存放程序及其数据的空间
程序及其数据可以长久存放在外存,在程序需要时才进入主存
主存需要利用地址区别第 2 章 数据信息的表达单位
计算机中信息的单位
二进制位 Bit,存储一位二进制数,0或 1
字节 Byte,8个二进制位,D7~ D0
字 Word,16位,2个字节,D15~ D0
双字 DWord,32位,4个字节,D31~ D0
最低有效位 LSB:数据的最低位,D0位
最高有效位 MSB:数据的最高位,对应字节,字,双字分别指 D7,D15,D31位图示第 2 章 存储单元及其存储内容
每个存储单元都有一个编号;
被称为存储器地址
每个存储单元存放一个字节的内容图示
0002H单元存放有一个数据 34H
表达为 [0002H]= 34H
第 2 章 多字节数据存放方式
多字节数据在存储器中占 连续的多个存储单元,
存放时,低字节存入低地址,高字节存入高地址 ;
表达时,用它的 低地址表示 多字节数据占据的地址空间 。
图示图 2.3中 2号,字,单元的内容为:
[0002H] = 1234H
2号,双字,单元的内容为:
[0002H] = 78561234H
80x86处理器采用,低对低,高对高,的存储形式,被称为,小端方式
Little Endian”。
相 对 应 还 存 在,大端方式 Big
Endian”。
第 2 章 数据的地址对齐
同一个存储器地址可以是字节单元地址,字单元地址,双字单元地址等等
字单元安排在偶地址 ( xxx0B),双字单元安排在模 4地址 ( xx00B) 等,被称为,地址对齐 ( Align),
对于不对齐地址的数据,处理器访问时,需要额外的访问存储器时间
应该将数据的地址对齐,以取得较高的存取速度视具体情况来确定第 2 章 存储器的分段管理
8086CPU有 20条地址线
最大可寻址空间为 220= 1MB
物理地址范围从 00000H~ FFFFFH
8086CPU将 1MB空间分成许多 逻辑段
( Segment)
每个段最大限制为 64KB
段地址的低 4位为 0000B
这样,一个存储单元除具有一个唯一的 物理地址 外,还具有多个 逻辑地址第 2 章 物理地址和逻辑地址
对应每个物理存储单元都有一个唯一的 20位编号,就是物理地址,
从 00000H~ FFFFFH。
分段后在用户编程时,采用逻辑地址,形式为段基地址,段内偏移地址分隔符第 2 章 逻辑地址
段地址 说明逻辑段在主存中的起始位置
8086规定段地址必须是模 16地址,xxxx0H
省略低 4位 0000B,段地址就可以用 16位数据表示,就能用 16位 段寄存器 表达段地址
偏移地址 说明主存单元距离段起始位置的偏移量
每段不超过 64KB,偏移地址也可用 16位 数据表示第 2 章 物理地址和逻辑地址的转换
将逻辑地址中的段地址左移 4位,
加上偏移地址就得到 20位物理地址
一个物理地址可以有多个逻辑地址 逻辑地址 1460:100,1380:F00物理地址 14700H 14700H
14600H
+ 100H
14700H
13800H
+ F00H
14700H
段地址左移 4位加上偏移地址得到物理地址第 2 章 段寄存器和逻辑段
8086有 4个 16位段寄存器
CS( 代码段 ) 指明 代码段 的起始地址
SS( 堆栈段 ) 指明 堆栈段 的起始地址
DS( 数据段 ) 指明 数据段 的起始地址
ES( 附加段 ) 指明 附加段 的起始地址
每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途第 2 章 如何分配各个逻辑段
程序的 指令序列 必须安排在代码段
程序使用的 堆栈 一定在堆栈段
程序中的 数据 默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段
数据的存放比较灵活,实际上可以存放在任何一种逻辑段中演示第 2 章 段超越前缀指令
没有指明时,一般的数据访问在 DS段;
使用 BP访问主存,则在 SS段
默认的情况允许改变,需要使用段超越前缀指令; 8086指令系统中有 4个:
CS,;代码段超越,使用代码段的数据
SS,;堆栈段超越,使用堆栈段的数据
DS,;数据段超越,使用数据段的数据
ES,;附加段超越,使用附加段的数据示例第 2 章 段超越的示例
没有段超越的指令实例:
MOV AX,[2000H] ; AX←DS,[2000H];从默认的 DS数据段取出数据
采用段超越前缀的指令实例:
MOV AX,ES:[2000H] ; AX←ES,[2000H];从指定的 ES附加段取出数据总结第 2 章 段寄存器的使用规定访问存储器的方式 默认 可超越 偏移地址取指令 CS 无 IP
堆栈操作 SS 无 SP
一般数据访问 DS CS ES SS 有效地址 EA
BP基址的寻址方式 SS CS ES DS 有效地址 EA
串操作的源操作数 DS CS ES SS SI
串操作的目的操作数 ES 无 DI
第 2 章 存储器的分段
8086对逻辑段 要求,
段地址低 4位均为 0
每段最大不超过 64KB
8086对逻辑段 并不要求,
必须是 64KB
各段之间完全分开 ( 即可以重叠 )
各段独立各段重叠最 多 多少段? 最 少 多少段?
第 2 章 2.1节的总结
8086有 8个 8位通用寄存器,8个 16位通用寄存器
8086有 6个状态标志和 3个控制标志
8086将 1MB存储空间分段管理,有 4
个段寄存器,对应 4种逻辑段
8086有 4个段超越前缀指令,用于明确指定数据所在的逻辑段熟悉上述内容后,就可以进入下节第 2 章 2.2 8086的寻址方式
从 8086的机器代码格式入手,论述:
立即数寻址方式
寄存器寻址方式
存储器寻址方式
进而熟悉 8086汇编语言指令格式,尤其是其中操作数的表达方法;为展开
8086指令系统做好准备第 2 章 指令的组成
指令由操作码和操作数两部分组成
操作码 说明计算机要执行哪种操作,如传送,
运算,移位,跳转等操作,它是指令中不可缺少的组成部分
操作数 是指令执行的参与者,即各种操作的对象
有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有 3个甚至 4
个操作数操作码 操作数第 2 章 指令的操作码和操作数
每种指令的 操作码,
用一个唯一的助记符表示 ( 指令功能的英文缩写 )
对应着机器指令的一个二进制编码
指令中的 操作数,
可以是一个具体的数值
可以是存放数据的寄存器
或指明数据在主存位置的存储器地址第 2 章 寻址方式
指令系统设计了多种操作数的来源
寻找操作数的过程就是操作数的寻址
操作数采取哪一种寻址方式,会影响机器运行的速度和效率如何寻址一个操作数对程序设计很重要第 2 章
给出立即寻址方式需要的数值本身
给出某些寻址方式需要的对基地址的偏移量
2.2.1 8086的机器代码格式
表明采用的寻址方式 ( 表 2.2)
1/2字节 0/1字节 0/1/2字节 0/1/2字节操作码 mod reg r/m 位移量 立即数操作数第 2 章 标准机器代码示例
mov ax,[BP+0] ;机器代码是 8B 46 00
前一个字节 8B是操作码 ( 含 w= 1表示字操作 )
中间一个字节 46( 01 000 110) 是,mod
reg r/m”字节
reg= 000表示目的操作数为 AX
mod= 01和 r/m= 110表示源操作数为 [BP+D8]
最后一个字节就是 8位位移量 〔 D8= 〕 00
1/2字节 0/1字节 0/1/2字节 0/1/2字节操作码 mod reg r/m 位移量 立即数第 2 章 其它机器代码形式
mov al,05 ;机器代码是 B0 05
前一个字节 B0是操作码 ( 含一个操作数 AL),后一个字节 05是立即数
mov ax,0102H ;机器代码是 B8 02 01
前一个字节 B8是操作码 ( 含一个操作数 AX),后两个字节 02 01是 16位立即数 ( 低字节 02在低地址 )
操作码 操作数第 2 章 指令的助记符格式操作码 操作数 1,操作数 2 ; 注释
操作数 2,称为 源操作数 src,它表示参与指令操作的一个对象
操作数 1,称为 目的操作数 dest,它不仅可以作为指令操作的一个对象,
还可以用来存放指令操作的结果
分号后的内容是对指令的解释示例第 2 章 传送指令 MOV的格式
MOV dest,src ; dest←src
MOV指令的功能是将源操作数 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]
演示第 2 章 2.2.2 立即数寻址方式
指令中的操作数直接存放在机器代码中,紧跟在操作码之后 ( 操作数作为指令的一部分存放在操作码之后的主存单元中 )
这种操作数被称为立即数 imm
它可以是 8位数值 i8( 00H~ FFH)
也可以是 16位数值 i16( 0000H~ FFFFH)
立即数寻址方式常用来给寄存器赋值第 2 章 立即数寻址指令
MOV AL,05H ; AL← 05H
MOV AX,0102H ; AX← 0102H
指令功能 执行过程第 2 章 2.2.3 寄存器寻址方式
操作数存放在 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
第 2 章 寄存器寻址指令
MOV AX,1234H ; AX← 1234H
MOV BX,AX ; BX←AX
指令功能 执行过程第 2 章 2.2.4 存储器寻址方式
指令中给出操作数的主存地址信息
( 偏移地址,称之为有效地址 EA),
而段地址在默认的或用段超越前缀指定的段寄存器中
8086设计了多种存储器寻址方式
1,直接寻址方式
2,寄存器间接寻址方式
3,寄存器相对寻址方式
4,基址变址寻址方式
5,相对基址变址寻址方式第 2 章 直接寻址方式
有效地址在指令中直接给出
默认的段地址在 DS段寄存器,
可使用段超越前缀改变
MOV AX,[2000H]; AX←DS,[2000H];指令代码,A10020
MOV AX,ES:[2000H]; AX←ES,[2000H];指令代码,26A10020
指令功能执行过程第 2 章 寄存器间接寻址方式
有效地址存放在基址寄存器 BX或变址寄存器 SI,DI中
默认的段地址在 DS段寄存器,可使用段超越前缀改变
MOV AX,[SI] ; AX←DS,[SI]
指令功能 执行过程第 2 章 寄存器相对寻址方式
有效地址是寄存器内容与有符号 8
位或 16位位移量之和,寄存器可以是 BX,BP或 SI,DI
有效地址= BX/BP/SI/DI+ 8/16位位移量
段地址对应 BX/SI/DI寄存器默认是
DS,对应 BP寄存器默认是 SS;
可用段超越前缀改变第 2 章 寄存器相对寻址指令
MOV AX,[DI+06H]; AX←DS,[DI+06H]
MOV AX,[BP+06H]; AX←SS,[BP+06H]
指令功能 执行过程第 2 章 基址变址寻址方式
有效地址由基址寄存器 ( BX或 BP)
的内容加上变址寄存器 ( SI或 DI)
的内容构成:
有效地址= BX/BP+ SI/DI
段地址对应 BX基址寄存器默认是
DS,对应 BP基址寄存器默认是
SS;可用段超越前缀改变第 2 章 基址变址寻址指令
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]
指令功能执行过程第 2 章 相对基址变址寻址方式
有 效 地 址 是 基 址 寄 存 器
( BX/BP),变址寄存器 ( SI/DI)
与一个 8位或 16位位移量之和:
有效地址= BX/BP+ SI/DI+ 8/16位位移量
段地址对应 BX基址寄存器默认是
DS,对应 BP基址寄存器默认是
SS;可用段超越前缀改变第 2 章 相对基址变址寻址指令
MOV AX,[BX+SI+06H]; AX←DS,[BX+SI+06H]
位移量可用符号表示同一寻址方式有多种表达形式指令功能 执行过程第 2 章 2.2.5 汇编语言指令格式
由 4部分组成:
标号,指令助记符 目的操作数,源操作数 ;注释标号表示该指令在主存中的逻辑地址每个指令助记符就代表一种指令目的和源操作数表示参与操作的对象注释是对该指令或程序段功能的说明第 2 章 指令操作数的表达 ( 1)
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
第 2 章 指令操作数的表达 ( 2)
m8—— 一个 8位存储器操作数单元 ( 所有主存寻址方式 )
m16—— 一个 16位存储器操作数单元 ( 所有主存寻址方式 )
mem—— 代表 m8或 m16
第 2 章 指令操作数的表达 ( 3)
i8—— 一个 8位立即数
i16—— 一个 16位立即数
imm—— 代表 i8或 i16
dest—— 目的操作数
src—— 源操作数第 2 章 8086指令系统概述
Intel 8086指令系统共有 117条基本指令,可分成 6个功能组
① 数据传送类指令
② 算术运算类指令
③ 位操作类指令
④ 串操作类指令
⑤ 控制转移类指令
⑥ 处理机控制类指令第 2 章 学习指令的注意事项
指令的功能 —— 该指令能够实现何种操作 。
通常指令助记符就是指令功能的英文单词或其缩写形式
指令支持的寻址方式 —— 该指令中的操作数可以采用何种寻址方式
指令对标志的影响 —— 该指令执行后是否对各个标志位有影响,以及如何影响
其他方面 —— 该指令其他需要特别注意的地方,如指令执行时的约定设置,必须预置的参数,隐含使用的寄存器等第 2章 教学要求 ( 1)
1,掌握 8086的寄存器组和存储器组织
2,掌握 8086的寻址方式
3,掌握 DEBUG调试程序的使用及调试指令和程序段的方法
4,习题 1( p70)
2.3 2.5 2.6 2.10 2.11
课间休息