第 1 章教学重点第 1章是用汇编语言进行程序设计所需要了解的基本知识 。 在课堂上,我们重点掌握几个内容:
PC机软硬件系统
认识汇编语言
基础是熟悉寄存器组
难点是各种寻址方式第 1 章 1.1 计算机系统概述
硬件 ( Hardware)
中央处理单元 CPU
控制器,运算器,寄存器
存储器
主存储器,RAM和 ROM
辅助存储器:磁盘,光盘,U盘
外部设备
输入设备和输出设备
软件 ( Software)
系统软件
应用软件第 1 章 微型计算机的系统组成
I/O
接口主存储器系统总线
CPU
寄存器控制器运算器 辅助存储器输入设备输出设备第 1 章 汇编语言程序员看到的硬件
中央处理单元 CPU( Intel 80x86)
对汇编语言程序员,最关心其中的 寄存器
存储器 ( 主存储器 )
呈现给汇编语言程序员的,是 存储器地址
外部设备 ( 接口电路 )
汇编语言程序员看到的是 端口 ( I/O地址 )
第 1 章 寄存器( Register)
寄存器是 CPU内部的高速存储单元
它们为处理器提供各种操作所需要的数据或地址等信息
汇编语言程序采用它们各自的符号名
16位 Intel 8086/80286 CPU中有
AX BX CX DX
SI DI BP SP
32位 80386/80486/Pentium系列 CPU中有
EAX EBX ECX EDX
ESI EDI EBP ESP
第 1 章 存储器地址( Address)
存储器是由大量存储单元组成,需要用编号区别每个单元,编号=地址
存储器地址 是存储器中存储单元的编号
每个存储单元存放一个字节量的数据
一个字节 B( Byte) = 8个二进制位 b( bit)
采用十六进制数来表达地址
Intel 8086具有 1兆字节 ( 1MB) 存储器容量
存储器地址表示为,00000H ~ FFFFFH
其中大写 H( 或小写 h) 表示是十六进制数第 1 章 端口( Port)
I/O接口电路由接口寄存器组成,需要用编号区别各个寄存器,编号=地址
I/O地址 是接口电路中寄存器的编号
端口 是 I/O地址的通俗说法
系统通过这些端口与外设进行通信
采用十六进制数来表达端口
Intel 8086支持 64K个 8位端口
I/O地址可以表示为,0000H~ FFFFH
第 1 章 计算机的程序设计语言
机器语言 ( Machine Language)
B8 64 00 05 00 01
汇编语言 ( Assembly Language)
mov ax,100;取得一个数据 100( MOV是传送指令 )
add ax,256;实现 100+256( ADD是加法指令 )
高级语言 ( High-level Language)
100+ 256
第 1 章 什么是汇编语言
以助记符形式表示计算机指令
助记符 ( mnemonic) 是便于人们记忆,并能描述指令功能和指令操作数的符号
助记符是表明指令功能的英语单词或其缩写
汇编格式指令以及使用它们编写程序的规则就形成汇编语言 ( Assembly Language)
汇编语言程序:用汇编语言书写的程序
汇编程序:将汇编语言程序,汇编,成机器代码目标模块的程序汇编语言程序与汇编程序是两个概念第 1 章 汇编语言和高级语言的比较 -1
汇编语言与处理器密切相关
↘ 汇编语言程序的通用性,可移植性较差
高级语言与具体计算机无关
↗ 高级语言程序是标准化语言,可在多种计算机上编译后执行汇编语言,× 高级语言,√
第 1 章 汇编语言和高级语言的比较 -2
汇编语言功能有限,涉及硬件细节
↘ 程序编写比较繁琐,调试比较困难
高级语言提供了强大的功能,不必关心琐碎问题
↗ 类似自然语言的语法,易于掌握和应用汇编语言,× 高级语言,√
第 1 章 汇编语言和高级语言的比较 -3
汇编语言本质上就是机器语言
↗ 可以直接,有效地控制计算机硬件
↗ 易于产生速度快,容量小的高效率目标程序
高级语言不针对具体计算机系统
↘ 不易直接控制计算机的各种操作
↘ 目标程序比较庞大,运行速度较慢汇编语言,√ 高级语言,×
第 1 章 汇编语言的特点
汇编语言的优点:
直接控制计算机硬件部件
编写,时间,和,空间,两方面最有效程序
汇编语言的缺点:
与处理器密切有关
需要熟悉计算机硬件系统,考虑许多细节
编写繁琐,调试,维护,交流和移植困难汇编语言,? 高级语言,?
第 1 章 汇编语言和高级语言的混合编程
汇编语言的优点使得它在程序设计中占有重要的位置,不可被取代
汇编语言的缺点使得人们主要采用高级语言进行程序开发工作
有时需要采用高级语言和汇编语言混合编程,
互相取长补短,更好地解决实际问题混合编程 取长补短第 1 章 汇编语言的应用场合
程序要具有较快的执行时间,或者只能占用较小的存储容量
程序与计算机硬件密切相关,程序要直接,
有效地控制硬件
大型软件需要提高性能,优化处理的部分
没有合适的高级语言,或只能采用汇编语言的时候
分析具体系统尤其是该系统的低层软件,加密解密软件,分析和防治计算机病毒等等汇编语言的作用实在不小 !
第 1 章 1.2 数据表示
1.2.1 数制
二进制数,十六进制数
它们与十进制数的相互转换
1.2.2 编码
BCD码和 ASCII码的规律
1.2.3 有符号数的表示法
有符号整数的补码表示
1.2.4 二进制运算
二进制的算术运算和逻辑运算
十进制的加减运算跳过第 1 章 二进制数
便于计算机存储及物理实现
特点:逢二进一,由 0和 1两个数码组成,基数为 2,各个位权以 2k表示
二进制数:
anan-1… a1a0.b1b2… bm=
an× 2n+ an-1× 2n-1+ … + a1× 21+ a0× 20
+ b1× 2-1+ b2× 2-2+ … + bm× 2-m
其中 ai,bj非 0即 1
第 1 章 十六进制数
用于表达二进制数,相互转换简单
基数 16,逢 16进位,位权为 16k,16个数码:
0,1,2,3,4,5,6,7,8,9
A,B,C,D,E,F
十六进制数:
anan-1… a1a0.b1b2… bm=
an× 16n+ an-1× 16n-1+ … + a1× 161+ a0× 160
+ b1× 16-1+ b2× 16-2+ … + bm× 16-m
其中 ai,bj是 0~ F中的一个数码第 1 章 十进制整数转换为二或十六进制数
整数 部分转换:用除法
十进制数整数部分不断除以基数 2或 16,并记下余数,直到商为 0为止
由最后一个余数起逆向取各个余数,则为转换成的二进制和十六进制数
126= 01111110B
126= 7EH
演示第 1 章 十进制小数转换为二或十六进制数
小数 部分转换:用乘法
分别乘以各自的基数,记录整数部分,直到小数部分为 0为止
0.8125= 0.1101B
0.8125= 0.DH
小数转换会发生总是无法乘到为 0的情况
可选取一定位数 ( 精度 )
将产生无法避免的转换误差演示第 1 章 二或十六进制数转换为十进制数
方法:按权展开
二进制数转换为十进制数
0011.1010B
= 1× 21+ 1× 20+ 1× 2-1+ 0× 2-2+ 1× 2-3
= 3.625
十六进制数转换为十进制数
1.2H
= 1× 160+ 2× 16- 1
= 1.125
十六进制数用后缀字母 H
二进制数用后缀字母 B
第 1 章 BCD码 ( Binary Coded Decimal)
二进制编码的十进制数
一个十进制数位 0~ 9用 4位二进制编码来表示
常用 8421 BCD码:低 10个 4位二进制编码表示
压缩 BCD码:一个字节表达两位 BCD码
非压缩 BCD码:一个字节表达一位 BCD码 ( 低
4位表达数值,高 4位常设置为 0)
BCD码很直观
BCD码,0100 1001 0111 1000.0001 0100 1001
十进制真值,4978.149
BCD码便于输入输出,表达数值准确第 1 章 ASCII码 (美国标准信息交换码)
标准 ASCII码用 7位二进制编码,有 128个
不可显示的控制字符前 32个和最后一个编码回车 CR,0DH 换行 LF,0AH 响铃 BEL,07H
可显示和打印的字符,20H后的 94个编码
数码 0~ 9,30H~ 39H
大写字母 A~ Z,41H~ 5AH
小写字母 a~ z,61H~ 7AH
空格,20H
扩展 ASCII码:最高 D7位为 1,表达制表符第 1 章 真值和机器数
真值,现实中真实的数值
机器数,计算机中用 0和 1数码组合表达的数值
无符号数,只表达 0和正整数的定点整数
有符号数,表达负整数,0和正整数的定点整数
符号位需要占用一个位
常用机器数的最高位
0表示正数,1表示负数
定点数,固定小数点的位置表达数值的机器数
定点整数:将小数点固定在机器数的最右侧表达的整数
定点小数:将小数点固定在机器数的最左侧表达的小数
浮点数,小数点浮动表达的实数第 1 章 补码
有符号整数在计算机中默认采用补码
最高位表示符号:正数用 0,负数用 1
正数补码:直接表示数值大小 ( 同无符号数 )
负数补码:将对应正数补码取反加 1
[105]补码 = 01101001B
[-105]补码 = [01101001B]取反+ 1
= 10010110B+ 1= 10010111B
8位二进制补码表示的数值范围,-128~ +127
16位二进制补码表示的数值范围,-215~ +215-1
32位二进制补码表示的数值范围,-231~ +231-1
演示为什么是补码第 1 章 负数求补
负数真值,取反加 1”得机器数补码
负数补码,取反加 1”得到负数真值补码,11100000B
真值,-([11100000]求反+ 1)= -(00011111+1)
= -00100000= -25= -32
负数求补运算,等效于用带借位的 0作减法真值,-8,补码,[-8]补码 = 00H-08H= F8H
补码,11111000,真值,-(00H-F8H)= -08H= -8
演示用十六进制表达和运算,方便 !
第 1 章 十六进制数的加减运算
二进制和十六进制数之间具有对应关系
整数从左向右
小数从右向左
每 4个二进制位对应一个十六进制位
00111010B= 3AH,F2H= 11110010B
十六进制数的加减运算类似十进制
逢 16进位 1,借 1当 16
23D9H+ 94BEH= B897H
A59FH- 62B8H= 42E7H
第 1 章 1.3 Intel 80x86系列微处理器
80386
80486
奔腾奔腾 II
奔腾 4
80286
8086
奔腾 III
IA-64(安腾)
4004
不是我不明白,
这世界变化太快。
扎扎实实掌握知识,
以不变应万变!
IA-32
第 1 章 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指令系统新增了若干条实用的指令
涉及堆栈操作,移位指令,输入输出指令,过程指令和边界检测及乘法指令第 1 章 80286
16位数据总线,24位地址总线 ( 16MB主存 )
实方式 ( Real Mode)
与 8086工作方式一样
保护方式 ( Protected Mode)
存储管理,保护机制和多任务管理的硬件支持
IBM PC/AT机使用 Intel 80286 CPU
80286指令系统新增 15条保护方式指令
16位 Intel 80x86 CPU,8086 / 80186 / 80286
32位 Intel 80x86 CPU( IA-32微处理器 ),
80386,80486,Pentium系列英特尔 32位结构,IA-32( Intel Architecture-32)
第 1 章 80386
32位结构
数据总线 32位,地址总线 32位,寻址 4GB主存
虚拟 8086方式 ( Virtual 8086 Mode)
保护方式下的 8086工作方式
系统管理方式( System Management Mode)
低功耗节能状态
80386指令系统全面升级为 32位
兼容原来 16位指令系统
新增有关位操作,条件设置指令以及对控制,
调试和测试寄存器的传送指令等第 1 章 80486
80486= 80386+ 80387+ 8KB Cache
浮点处理单元 FPU
8086/8088,8087
80286,80287
80386,80387
高速缓冲存储器 Cache
复杂指令集计算机 CISC融合精简指令集计算机
RISC的技术特点
80486指令系统新增用于多处理器和内部 Cache操作的 6条指令第 1 章 Pentium
俗称的 80586微处理器,奔腾微处理器
32位结构,连接主存的数据总线是 64位
超标量 ( Superscalar) 技术
Pentium指令系统新增
一条 8字节比较交换指令
一条处理器识别指令
4条系统专用指令第 1 章 Pentium Pro
原称 P6,中文名称为,高能奔腾,
两个芯片组成
扩展的超标量技术
动态执行技术
Pentium Pro新增 3条指令第 1 章 Pentium II
多媒体扩展指令 ( MMX指令 )
MMX( MutliMedia eXtension)
整数运算多媒体指令
优化图像,音频,视频和通信方面的程序进行
提升微机对多媒体的处理能力
Pentium MMX( 多能奔腾 ),MMX指令应用于 Pentium处理器
Pentium II,MMX指令应用于 Pentium Pro
第 1 章 Pentium III
数据流 SIMD扩展指令 ( SSE指令 )
SSE( Streaming SIMD Extensions)
浮点单精度多媒体运算指令
提高浮点 3D数据的处理能力 。
SSE指令类似于 AMD公司发布的 3D Now!指令
Pentium III,SSE指令应用于 Pentium II
单指令多数据 SIMD
Single Instruction Multiple Data
表示一条指令具有同时处理多组数据的能力第 1 章 Pentium 4
NetBurst的微结构 ( Microarchitecture)
进一步发掘指令之间可以同时执行的能力
超线程 HT( Hyper Threading)
发掘程序中的并行性
一个物理处理器形成两个逻辑处理器
SSE2指令
增强浮点双精度多媒体运算能力
SSE3指令
增强和完善 MMX,SSE和 SSE2指令第 1 章 Intel 80x86微处理器
Celeron( 赛扬 ) 微处理器
面向低端 ( 低价位 ) PC机
Xeon( 至强 ) 微处理器
面向高端服务器,工作站
AMD微处理器
AMD公司生产的 IA-32微处理器兼容芯片
Intel公司最主要的竞争对手
双核微处理器
单芯片多处理器 SMP技术
Intel的 Pentium D:单芯片双 Pentium 4核心
64位微处理器
AMD的 K8核心:兼容 IA-32的 64位微处理器
Intel的 EM64T( 扩展 64位技术 ),IA-32的 64位扩展第 1 章 1.4 PC微型计算机
本课程采用 16位或 32位个人计算机
16位 PC机
8088 CPU的 IBM PC和 IBM PC/XT
80286 CPU的 IBM PC/AT
16位 80x86 CPU的 PC兼容机
32位 PC机
采用 32位 80x86 CPU而形成的微机
基本结构仍然源于 PC/AT机
人们日常谈论的 PC机或微机是上述微型计算机系统的统称第 1 章 主存空间的分配第 1 章 PC机最低 1MB主存
系统 RAM区
地址最低端的 640KB空间
由 DOS进行管理
显示 RAM区
128KB主存空间保留给显示缓冲存储区
显示 RAM区并没有被完全使用
扩展 ROM区
I/O接口电路卡上的 ROM
系统 ROM区
ROM-BIOS程序第 1 章 微机的软件
系统软件,DOS平台
MS-DOS 6.22实地址方式
Windows的 MS-DOS模拟环境
应用软件:开发汇编语言程序涉及
文本编辑器
汇编程序
连接程序
调试程序
集成化开发环境本教材提供
DOS-MASM615.EXE
第 1 章 文本编辑器( Editor)
文本编辑器用于编辑无任何格式的文档
程序设计要采用文本编辑器编写源程序
常见的文本编辑软件有很多,如
MS-DOS的 EDIT全屏幕编辑器
Windows的 Notepad计事本
程序开发系统中的程序编辑器
Turbo C
Visual Studio
MASM的 PWB
第 1 章 汇编程序( 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位指令系统第 1 章 连接程序( Linker)
连接程序将汇编后的目标模块转换为可执行程序
每个程序开发环境都有连接程序
连接程序的文件名通常是,LINK.EXE
32位 Windows连接程序不同于 16位 DOS连接程序源程序 可执行文件目标模块文本编辑器 汇编程序 连接程序 调试程序第 1 章 调试程序( Debugger)
调试程序进行程序排错,分析等
本课程采用 MASM的 CodeView
DOS的 DEBUG程序
还有 Turbo Debugger等源程序 可执行文件目标模块文本编辑器 汇编程序 连接程序 调试程序第 1 章 集成化开发环境
进行程序设计使用的各种软件的有机集合,
有文本编辑器,有语言翻译程序,有连接程序,还组合有调试程序等
大型的程序设计项目往往要借助这种集成开发环境,也就是软件开发工具 ( 包 )
MASM提供程序员工作平台 PWB
微软的 Visual Studio开发系统第 1 章 MASM编程环境的使用
1,进入模拟 DOS环境
2,将 MASM目录作为当前目录
3,开发汇编语言程序
ml /Fl filename.asm
4,运行可执行程序
5,调试可执行程序定制进入 MASM快捷方式 ML615
创建快速开发文件 MLL.BAT
构造方便的调试环境 CV.BAT
第 1 章 1.5 8086微处理器
微处理器是微机的硬件核心,主要包含指令执行的运算和控制部件,还有多种寄存器
对程序员来说,微处理器抽象为以名称存取的寄存器
8086内部结构有两个功能模块,完成一条指令的取指和执行功能
总线接口单元 BIU:负责读取指令和操作数
执行单元 EU:负责指令译码和执行
8086的内部结构内部暂存器
IP
ES
SS
DS
CS
输入 /输出控制电路外部总线执行部分控制电路 1 2 3 4 5 6

ALU
标志寄存器
AH AL
BH BL
CH CL
DH DL
SP
BP
SI
DI
通用寄存器地址加法器指令队列缓冲器执行部件 ( EU) 总线接口部件 ( BIU)
16位
20位
16位
8位执行
8086的寄存器组第 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位的数据第 1 章 数据寄存器
数据寄存器用来存放计算的结果和操作数,
也可以存放地址
每个寄存器又有它们各自的专用目的
AX--累加器,使用频度最高,用于算术,逻辑运算以及与外设传送信息等;
BX--基址寄存器,常用做存放存储器地址;
CX--计数器,作为循环和串操作等指令中的隐含计数器;
DX--数据寄存器,常用来存放双字长数据的高 16位,或存放外设端口地址 。
第 1 章 变址及指针寄存器
变址寄存器常用于存储器寻址时提供地址
SI是源变址寄存器
DI是目的变址寄存器
指针寄存器用于寻址内存 堆栈 内的数据
SP为堆栈指针寄存器,指示栈顶的偏移地址,
不能再用于其他目的,具有专用目的
BP为基址指针寄存器,表示数据在堆栈段中的基地址
SI和 DI在串操作指令有特殊用法
SP和 BP寄存器与 SS段寄存器联合使用确定堆栈段中的存储单元地址第 1 章 堆栈( Stack)
堆栈是主存中一个特殊的区域
它采用 先进后出 FILO( First In Last Out)
或后进先出 LIFO( Last In First Out) 的原则进行存取操作,而不是随机存取操作方式
堆栈通常由处理器自动维持
在 8086中,由堆栈段寄存器 SS和堆栈指针寄存器 SP共同指示第 1 章 指令指针 IP
指令指针寄存器 IP,指示代码段中指令的偏移地址
它与代码段寄存器 CS联用,确定下一条指令的物理地址
计算机通过 CS,IP寄存器来控制指令序列的执行流程
IP寄存器是一个专用寄存器第 1 章 标志寄存器
标志 ( Flag) 用于反映指令执行结果或控制指令执行形式,形成 16位标志寄存器 FLAGS( 程序状态字 PSW寄存器 )
状态标志--用来记录程序运行结果的状态信息,
许多指令的执行都将相应地设置它
CF ZF SF PF OF AF
控制标志--可由程序根据需要用指令设置,用于控制处理器执行指令的方式
DF IF TF
OF
1115 12
DF
10
IF
9
TF
8
SF
7
ZF
6 5
AF
4 3
PF
2 1
CF
0
第 1 章 进位标志 CF( Carry Flag)
当运算结果的最高有效位有进位 ( 加法 ) 或借位 ( 减法 ) 时,进位标志置 1,即 CF = 1;
否则 CF = 0。
3AH + 7CH= B6H,没有进位,CF = 0
AAH + 7CH= ( 1) 26H,有进位,CF = 1
第 1 章 零标志 ZF( Zero Flag)
若运算结果为 0,则 ZF = 1;
否则 ZF = 0
3AH + 7CH= B6H,结果不是零,ZF = 0
84H + 7CH= ( 1) 00H,结果是零,ZF = 1
注意,ZF为 1表示的结果是 0
第 1 章 符号标志 SF( Sign Flag)
运算结果最高位为 1,则 SF = 1;否则
SF = 0
3AH + 7CH= B6H,最高位 D7= 1,SF = 1
84H + 7CH= ( 1) 00H,最高位 D7= 0,SF = 0
有符号数据用最高有效位表示数据的符号所以,最高有效位就是符号标志的状态第 1 章 奇偶标志 PF( Parity Flag)
当运算结果最低字节中,1”的个数为零或偶数时,PF = 1;否则 PF = 0
3AH + 7CH= B6H= 10110110B
结果中有 5个 1,是奇数,PF = 0
PF标志仅反映最低 8位中,1”的个数是偶或奇,即使是进行 16位字操作第 1 章 溢出标志 OF( Overflow Flag)
若算术运算的结果有溢出,则 OF= 1;
否则 OF= 0
3AH + 7CH= B6H,产生溢出,OF = 1
AAH + 7CH= ( 1) 26H,没有溢出,OF = 0
问题什么是溢出?
溢出和进位有什么区别?
处理器怎么处理,程序员如何运用?
如何判断是否溢出?
第 1 章 什么是溢出
处理器内部以补码表示有符号数
8位表达的整数范围是:+ 127~- 128
16位表达的范围是:+ 32767~- 32768
如果运算结果超出这个范围,就产生了溢出
有溢出,说明有符号数的运算结果不正确
3AH+ 7CH= B6H,就是 58+ 124= 182,
已经超出- 128~+ 127范围,产生溢出,故 OF= 1;
另一方面,补码 B6H表达真值是 -74,
显然运算结果也不正确第 1 章 溢出和进位的对比例 1,3AH + 7CH= B6H
无符号数运算,58+ 124= 182
范围内,无进位有符号数运算,58+ 124= 182
范围外,有溢出例 2,AAH + 7CH= ( 1) 26H
无符号数运算,170+ 124= 294
范围外,有进位有符号数运算,- 86+ 124= 28
范围内,无溢出第 1 章 如何运用溢出和进位
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志 CF;
同时,根据是否超出有符号数的范围设置溢出标志 OF
应该利用哪个标志,则由程序员来决定 。 也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,
则要注意是否溢出第 1 章 溢出的判断
判断运算结果是否溢出的简单规则:
只有当两个相同符号数相加 ( 包括不同符号数相减 ),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确
其他情况下,则不会产生溢出第 1 章 辅助进位标志 AF( Auxiliary Carry Flag)
3AH + 7CH= B6H,D3有进位,AF = 1
运算时 D3位 ( 低半字节 ) 有进位或借位时,AF = 1;否则 AF = 0。
这个标志主要由处理器内部使用,
用于十进制算术运算调整指令中,用户一般不必关心第 1 章 方向标志 DF( Direction Flag)
用于串操作指令,控制地址的变化方向:
设置 DF= 0,存储器地址自动增加;
设置 DF= 1,存储器地址自动减少 。
CLD指令复位方向标志,DF= 0
STD指令置位方向标志,DF= 1
第 1 章 中断允许标志 IF( Interrupt-enable Flag)
用于控制外部可屏蔽中断是否可以被处理器响应:
设置 IF= 1,则允许中断;
设置 IF= 0,则禁止中断 。
CLI指令复位中断标志,IF= 0
STI指令置位中断标志,IF= 1
第 1 章 陷阱标志 TF( Trap Flag)
用于控制处理器进入单步操作方式:
设置 TF= 0,处理器正常工作;
设置 TF= 1,处理器单步执行指令 。
单步执行指令 —— 处理器在 每条指令执行结束 时,
便产生一个编号为 1的内部中断
这种内部中断称为 单步中断
所以 TF也称为 单步标志
利用单步中断可对程序进行逐条指令的调试
这种逐条指令调试程序的方法就是 单步调试第 1 章 数据信息的表达单位
计算机中信息的单位
二进制位 Bit,存储一位二进制数,0或 1
字节 Byte,8个二进制位,D7~ D0
字 Word,16位,2个字节,D15~ D0
双字 DWord,32位,4个字节,D31~ D0
最低有效位 LSB:数据的最低位,D0位
最高有效位 MSB:数据的最高位,对应字节,
字,双字分别指 D7,D15,D31位第 1 章 数据的存储格式
D7 D0 字节
D15 D0 字
D31 D0 双字
D7 D0
00006H
78H 00005H
56H 00004H
12H 00003H
34H 00002H
00001H
00000H 低地址第 1 章 存储单元及其存储内容
主存储器需要利用地址区别
每个存储单元都有一个编号;被称为存储器地址
每个存储单元存放一个字节的内容
0002H单元存放有一个数据 34H
表达为 [0002H]= 34H
第 1 章 多字节数据存放方式
多字节数据在存储器中占 连续的多个存储单元,
存放,低字节存入低地址,高字节存入高地址
表达:用 低地址表示 多字节数据占据的地址空间
2号,字,单元的内容为:
[0002H] = 1234H
2号,双字,单元的内容为:
[0002H] = 78561234H
80x86处理器采用,低对低,高对高,,小端方式 Little Endian
第 1 章 数据的地址对齐
同一个存储器地址可以是字节单元地址,
字单元地址,双字单元地址等等
字单元安排在偶地址 ( xxx0B),双字单元安排在模 4地址 ( xx00B) 等,被称为,地址对齐 ( Align),
对于不对齐地址的数据,处理器访问时,
需要额外的访问存储器时间
应该将数据的地址对齐,以取得较高的存取速度第 1 章 存储器的分段管理
8086 CPU有 20条地址线
最大可寻址空间为 220= 1MB
物理地址范围从 00000H~ FFFFFH
8086CPU 将 1MB 空 间 分 成 许 多 逻辑段
( Segment)
每个段最大限制为 64KB
段地址的低 4位为 0000B
这样,一个存储单元除具有一个唯一的 物理地址 外,还具有多个 逻辑地址第 1 章 物理地址和逻辑地址
每个物理存储单元有一个唯一的 20位编号,即物理地址:
00000H~ FFFFFH
分段后用户编程时,采用逻辑地址:
段基地址,段内偏移地址分隔符第 1 章 逻辑地址
段地址 说明逻辑段在主存中的起始位置
8086规定段地址必须是模 16地址,xxxx0H
省略低 4位 0000B,段地址就可以用 16位数据表示,就能用 16位 段寄存器 表达段地址
偏移地址 说明主存单元距离段起始位置的偏移量
每段不超过 64KB,偏移地址也可用 16位 数据表示第 1 章 物理地址和逻辑地址的转换
将逻辑地址中的段地址左移 4位,加上偏移地址就得到 20位物理地址
一个物理地址可以有多个逻辑地址逻辑地址 1460:100,1380:F00
物理地址 14700H 14700H
14600H
+ 100H
14700H
13800H
+ F00H
14700H
段地址左移 4位加上偏移地址得到物理地址第 1 章 段寄存器
8086有 4个 16位段寄存器,每个段寄存器确定一个逻辑段的起始地址,每种逻辑段均有各自的用途
CS( Code Segment)
指明代码段的起始地址
SS( Stack Segment)
指明堆栈段的起始地址
DS( Data Segment)
指明数据段的起始地址
ES( Extra Segment)
指明附加段的起始地址第 1 章 代码段 ( Code Segment)
代码段用来存放程序的指令序列
代码段寄存器 CS存放代码段的段地址
指令指针寄存器 IP指示下条指令的偏移地址
处理器利用 CS:IP取得下一条要执行的指令第 1 章 堆栈段 ( Stack Segment)
堆栈段确定堆栈所在的主存区域
堆栈段寄存器 SS存放堆栈段的段地址
堆栈指针寄存器 SP指示堆栈栈顶的偏移地址
处理器利用 SS:SP操作堆栈顶的数据第 1 章 数据段 ( Data Segment)
数据段存放运行程序所用的数据
数据段寄存器 DS存放数据段的段地址
各种主存寻址方式 ( 有效地址 EA) 得到存储器中操作数的偏移地址
处理器利用 DS:EA存取数据段中的数据第 1 章 附加段 ( Extra Segment)
附加段是附加的数据段,也用于数据的保存:
附加段寄存器 ES存放附加段的段地址
各种主存寻址方式 ( 有效地址 EA) 得到存储器中操作数的偏移地址
处理器利用 ES:EA存取附加段中的数据
串操作指令将附加段作为其目的操作数的存放区域第 1 章 如何分配各个逻辑段
程序的 指令序列 必须安排在代码段
程序使用的 堆栈 一定在堆栈段
程序中的 数据 默认是安排在数据段,
也经常安排在附加段,尤其是串操作的目的区必须是附加段
数据的存放比较灵活,实际上可以存放在任何一种逻辑段中第 1 章 段超越前缀指令
没有指明时,一般的数据访问在 DS段;使用
BP访问主存,则在 SS段
默认的情况允许改变,需要使用段超越前缀指令; 8086指令系统中有 4个:
CS,;代码段超越,使用代码段的数据
SS,;堆栈段超越,使用堆栈段的数据
DS,;数据段超越,使用数据段的数据
ES,;附加段超越,使用附加段的数据第 1 章 段超越的示例
没有段超越的指令实例:
MOV AX,[2000H] ; AX←DS,[2000H];从默认的 DS数据段取出数据
采用段超越前缀的指令实例:
MOV AX,ES:[2000H] ; AX←ES,[2000H];从指定的 ES附加段取出数据第 1 章 段寄存器的使用规定访问存储器的方式 默认 可超越 偏移地址取指令 CS 无 IP
堆栈操作 SS 无 SP
一般数据访问 DS CS ES SS 有效地址 EA
BP基址的寻址方式 SS CS ES DS 有效地址 EA
串操作的源操作数 DS CS ES SS SI
串操作的目的操作数 ES 无 DI
第 1 章 存储器的分段
8086对逻辑段 要求,
段地址低 4位均为 0
每段最大不超过 64KB
8086对逻辑段 并不要求,
必须是 64KB
各段之间完全分开 ( 即可以重叠 )
第 1 章 各个逻辑段独立第 1 章 各个逻辑段重叠第 1 章 1MB空间的分段
1MB空间最多能分成多少个段?
每隔 16个存储单元就可以开始一个段
所以 1MB最多可以有:
220÷ 16= 216= 64K 个段
1MB空间最少能分成多少个段?
每隔 64K个存储单元开始一个段
所以 1MB最少可以有:
220÷ 216= 16 个段第 1 章 1.6 8086的寻址方式
指令系统设计了多种操作数的来源
寻找操作数的过程就是操作数的寻址
操作数采取哪一种寻址方式,会影响机器运行的速度和效率
如何寻址一个操作数对程序设计很重要上机实践的建议配合调试程序单步执行每条指令或调用 IO.LIB的子程序显示结果第 1 章 指令的组成
指令由操作码和操作数两部分组成
操作码 说明计算机要执行哪种操作,如传送,运算,移位,跳转等操作,它是指令中不可缺少的组成部分
操作数 是指令执行的参与者,即各种操作的对象
有些指令不需要操作数,通常的指令都有一个或两个操作数,个别指令有 3个甚至 4个操作数操作码 操作数第 1 章 指令的操作码和操作数
每种指令的 操作码,
用一个唯一的助记符表示 ( 指令功能的英文缩写 )
对应着机器指令的一个二进制编码
指令中的 操作数,
可以是一个具体的数值
可以是存放数据的寄存器
或指明数据在主存位置的存储器地址第 1 章
给出立即寻址方式需要的数值本身
给出某些寻址方式需要的对基地址的偏移量
8086的机器代码格式
表明采用的寻址方式 ( 表 1.7)
1/2字节 0/1字节 0/1/2字节 0/1/2字节操作码 mod reg r/m 位移量 立即数操作数第 1 章 标准机器代码示例
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 位移量 立即数第 1 章 其它机器代码形式
mov al,05 ;机器代码是 B0 05
前一个字节 B0是操作码 ( 含一个操作数 AL),后一个字节 05是立即数
mov ax,0102H ;机器代码是 B8 02 01
前一个字节 B8是操作码 ( 含一个操作数 AX),后两个字节 02 01是 16位立即数 ( 低字节 02在低地址 )
操作码 操作数第 1 章 指令的助记符格式操作码 操作数 1,操作数 2 ; 注释
操作数 2,称为 源操作数 src,它表示参与指令操作的一个对象
操作数 1,称为 目的操作数 dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果
分号后的内容是对指令的解释第 1 章 传送指令 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]
第 1 章 传送指令 MOV的功能源操作数 src
目的操作数 dest30H
30H
被传送的数据第 1 章 立即数寻址方式
指令中的操作数直接存放在机器代码中,紧跟在操作码之后 ( 操作数作为指令的一部分存放在操作码之后的主存单元中 )
这种操作数被称为立即数 imm
它可以是 8位数值 i8( 00H~ FFH)
也可以是 16位数值 i16( 0000H~ FFFFH)
立即数寻址方式常用来给寄存器赋值
MOV AL,05H ; AL← 05H
MOV AX,0102H ; AX← 0102H
第 1 章 立即数寻址指令
MOV AX,0102H ; AX← 0102H
立即寻址第 1 章 寄存器寻址方式
操作数存放在 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
第 1 章 寄存器寻址指令
MOV BX,AX ; BX←AX
寄存器寻址第 1 章 存储器寻址方式
指令中给出操作数的主存地址信息 ( 偏移地址,称之为有效地址 EA),而段地址在默认的或用段超越前缀指定的段寄存器中
8086设计了多种存储器寻址方式
1,直接寻址方式
2,寄存器间接寻址方式
3,寄存器相对寻址方式
4,基址变址寻址方式
5,相对基址变址寻址方式第 1 章 直接寻址方式
有效地址在指令中直接给出
默认的段地址在 DS段寄存器,可使用段超越前缀改变
MOV AX,[2000H]; AX←DS,[2000H];指令代码,A1 00 20
MOV AX,ES:[2000H]; AX←ES,[2000H];指令代码,26 A1 00 20
第 1 章 直接寻址指令
MOV AX,[2000H] ; AX←DS,[2000H]
直接寻址第 1 章 寄存器间接寻址方式
有效地址存放在基址寄存器 BX或变址寄存器 SI,DI中
默认的段地址在 DS段寄存器,可使用段超越前缀改变
MOV AX,[SI] ; AX←DS,[SI]
间接寻址第 1 章 寄存器相对寻址方式
有效地址是寄存器内容与有符号 8位或 16位位移量之和,寄存器可以是 BX/BP或 SI/DI
有效地址= BX/BP/SI/DI+ 8/16位位移量
段地址对应 BX/SI/DI寄存器默认在 DS,对应 BP寄存器默认在 SS;可用段超越前缀
MOV AX,[DI+06H] ; AX←DS,[DI+06H]
MOV AX,[BP+06H] ; AX←SS,[BP+06H]
相对寻址第 1 章 基址变址寻址方式
有效地址由基址寄存器 ( 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]
基址变址第 1 章 相对基址变址寻址方式
有效地址是基址寄存器 (BX/BP),变址寄存器 (SI/DI)与一个 8位或 16位位移量之和:
有效地址= BX/BP+ SI/DI+ 8/16位位移量
段地址对应 BX基址寄存器默认是 DS,对应
BP基址寄存器默认是 SS;可用段超越前缀
MOV AX,[BX+SI+06H]; AX←DS,[BX+SI+06H] 相对基址变址位移量可用符号表示同一寻址方式有多种表达形式第 1 章 寻址方式的多种表示方式
位移量可用符号表示:
MOV AX,[SI+COUNT]; COUNT是事先定义的变量或常量 ( 就是数值 )
MOV AX,[BX+SI+WNUM] ; WNUM是变量或常量
同一寻址方式可以写成不同的形式:
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]
第 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
第 1 章 存储器操作数的表达
m8—— 一个 8位存储器操作数单元 ( 所有主存寻址方式 )
m16—— 一个 16位存储器操作数单元
( 所有主存寻址方式 )
mem—— 代表 m8或 m16
第 1 章 立即数的表达
i8—— 一个 8位立即数
i16—— 一个 16位立即数
imm—— 代表 i8或 i16
dest—— 目的操作数
src—— 源操作数第 1章 教学要求
1,了解微机系统的基本软硬件组成
2,熟悉汇编语言的基本概念和应用特点
3,掌握 8086的寄存器组和存储器组织
4,掌握 8086的寻址方式习题
1.10 1.11 1.17 1.19 1.20 1.24