汇编语言程序设计:第1章

Download Report

Transcript 汇编语言程序设计:第1章

微型计算机原理
及接口技术
授课教师:
周茂霞
第 3章
微型计算机指令系统
微处理器飞速发展
IA-64
奔腾4代(安腾)
奔腾3代
奔腾2代
奔腾
80486
80386
80286
8086
4004
不是我不明白,
这世界变化太快。
扎扎实实掌握知识,
以不变应万变!
教学重点
第3章是用汇编语言进行程序设
计所需要了解的基本知识和指令
系统。在课堂上,我们重点掌握
几个内容:
熟悉指令的功能与用法
认识汇编语言
熟悉寄存器组
难点是各种寻址方式
第 3 章
什么是汇编语言(1)
 汇编语言是一种面向机器的低级程序
设计语言
 汇编语言以助记符形式表示每一条计
算机指令
 助记符(mnemonic)是便于人们
记忆、并能描述指令功能和指令操
作数的符号
 助记符一般就是表明指令功能的英
语单词或其缩写
第 3 章
什么是汇编语言(2)
 用助记符表示的指令就是汇编语言中
的汇编格式指令
 汇编格式指令以及使用它们编写程序
的 规 则 就 形 成 汇 编 语 言 ( Assembly
Language)
 用汇编语言书写的程序就是汇编语言
程序,或称汇编语言源程序(.ASM)
 汇编程序将汇编语言程序“汇编”成
机器代码目标模块(.OBJ)
第 3 章
什么是汇编语言(3)
 汇编语言的主要特点:
 汇编语言程序与处理器指令系统密切
相关
 程序员可直接、有效地控制系统硬件
 形成的可执行文件运行速度快、占用
主存容量少
汇编语言程序与汇编程序是两个概念
第 3 章
汇编语言和高级语言(1)
 汇编语言与处理器密切相关
↘ 汇编语言程序的通用性、可移植
性较差
 高级语言与具体计算机无关
↗ 高级语言程序可以在多种计算机
上编译后执行
汇编语言:×
高级语言:√
第 3 章
汇编语言和高级语言(2)
 汇编语言功能有限、涉及硬件细节
↘ 编写程序比较繁琐,调试起来也比
较困难
 高级语言提供了强大的功能,不必
关心琐碎问题
↗类似自然语言的语法,易于掌握和
应用
汇编语言:×
高级语言:√
第 3 章
汇编语言和高级语言(3)
 汇编语言本质上就是机器语言
↗ 可以直接、有效地控制计算机硬件
↗ 易于产生速度快、容量小的高效率
目标程序
 高级语言不针对具体计算机系统
↘ 不易直接控制计算机的各种操作
↘ 目标程序比较庞大、运行速度较慢
汇编语言:√
高级语言:×
第 3 章
汇编语言和高级语言(4)
 汇编语言的优点:
 直接控制计算机硬件部件
 可以编写在“时间”和“空间”两方面最
有效的程序
 汇编语言的缺点:
 与处理器密切有关
 需要熟悉计算机硬件系统、考虑许多细节
 编写繁琐,调试、维护、交流和移植困难
汇编语言:?
高级语言:?
第 3 章
汇编语言和高级语言(5)
 汇编语言的优点使得它在程序设计中
占有重要的位置,是不可被取代的
 汇编语言的缺点使得人们主要采用高
级语言进行程序开发工作
 有时需要采用高级语言和汇编语言混
合编程的方法,互相取长补短,更好
地解决实际问题
混合编程
取长补短
第 3 章
指令分类
8086/8088 CP的指令系统共包含92中基本指令,
按照功能分可将它们分为6大类:
1、数据传送指令
2、算术运算指令
3、逻辑运算与移位指令
4、串操作指令
5、控制转移指令
6、处理器控制指令
上述各指令有的指令只有一个操作数,而有
的指令有两个操作数,也有的指令没有操作数。
第 3 章 3.1指令的构成与操作数的类型
3.1.1 指令构成
指令系统根据CPU系统不同由几十条到几百条构成。
一条指令:
操作码字段(OP-code)
MOV
操作数字段(Operand)
AX, [2000H]
操作码字段是表明指令执行何种性质的操作。机器
语言是一组二进制代码,汇编语言是用助记符。
操作数字段是指明指令执行所需要的操作数。可以
是操作数本身或操作数地址。
第 3 章 3.1指令的构成与操作数的类型
3.1.1 指令构成
一条指令:
操作码字段(OP-code)
操作数字段(Operand)
MOV
AX, [2000H]
INT
AX
HLT
无操作数指令 :一般属于控制类指令。
单操作数指令
双操作数指令(目的操作数DST,源操作数SRC)
第 3 章 3.1指令的构成与操作数的类型
3.1.1 指令构成
指令的基本格式:
操作码
操作数或
操作数地址
第 3 章 3.1指令的构成与操作数的类型
3.1.3 操作书的类型
操作数有三种类型:
立即数操作数
寄存器操作数
存储器操作数
第 3 章 3.1指令的构成与操作数的类型
3.1.3 操作书的类型
1、立即数操作数:
可以使用立即数操作数的指令有,数据传送指令、算术运算指令、
逻辑运算指令等。这些指令只能作为源操作数,而不能作为目的操
作数。
INT
20H
X
MOV
20H, AX
X
MOV
AX ,20H
立即数有固定的数值,不会因为指令的执行而发生变化。目
的操作数必须是寄存器或存储器。
第 3 章 3.1指令的构成与操作数的类型
立即数:
可以是8位或16位的带符号的数,也可以是8位或16 位的无符号
数,但必须是整数、变量、或其他数据,不能为小数。
立即数取值范围
8位数
16位数
无符号
00H---0FFH (0---255)
0000H—0FFFFH(0---65535)
带符号
80H---7FH(-128---+127)
8000H-----7FFFH(-32768----+32767)
第 3 章 3.1指令的构成与操作数的类型
2、寄存器操作数:
寄存器操作数可以存放于CPU内部寄存器中,即通用寄存器、
地址指针寄存器、变址寄存器、段寄存器。
通用寄存器:4个16位寄存器AX、BX、CX、DX,存放字操作数。
8个8位寄存器, AL、BL、CL、DL; AH、BH、CH、DH
存放字节操作数。
所有的通用寄存器与地址指针寄存器既可以用做源操作数,又可以
用做目的操作数。在算术与逻辑运算指令中,常将AX用做累加器。
第 3 章 3.1指令的构成与操作数的类型
2、寄存器操作数:
段寄存器DS、ES、SS、CS用以存放当前的段地址,在与通用
寄存器或存储器传送数据时,段寄存器通常既可以用做源操作数,
又可以用做目的操作数,但是不能用一条指令简单的将立即数传送
到段寄存器。
解决方法:先把立即数送通用寄存器,再由段寄存器转送
到段寄存器。
MOV
DS , 2000H(X)
MOV
AX,2000H
MOV DS,AX
但对于代码寄存器CS,
一般不要求用户赋值,系统
安排。
第 3 章 3.1指令的构成与操作数的类型
3、存储器操作数:
存储器操作数可能是8位,16位、32位的二进制数,存放与存
储器中,要占1个、2个或4个存储单元,分别是字节(Byte)型、
字型(Word)或双字(Dword)型。
在指令中,存储器操作数既可以用做源操作数,又可
以用做目的操作数,但是不允许两者都为存储器操作数,也
就是不允许从存储器到存储器的操作。
MOV
MOV
3000H , 2000H(X) MOV
AX,[2000H]
MOV [3000H],AX
MOV
[BX] ,[SI](X)
AX,[SI]
MOV [BX],AX
第 3 章 3.1指令的构成与操作数的类型
3、存储器操作数:
在指令中,存储器操作数分为: 标号 与 变量 两种。
标号:是对存放指令的存储单元地址所命名的名称,可执行
语句的符号地址。标号可以直接出现在指令中,指向转移地址。
变量:是指存储变量,为存放数据的存储单元所起的名称。
变量由定义数据的操作命令 DB 、DW、DD定义
第 3 章 3.1指令的构成与操作数的类型
3、存储器操作数:
符号地址(标号 和 变量 )的三种属性
(1)段属性(SEGMENT)
标号或变量 具有所对应段的段地址,它们都在段寄存器
(CS、DS、ES、SS)。标号所在段基址的通常在CS中,
存储变量段基址在DS中。无段超越,隐式出现。
(2)偏移量属性(OFFSET)
标号或变量所在地址距离段基址的偏移量。
第 3 章 3.1指令的构成与操作数的类型
(3)类型属性(TYPE)
标号类型属性:段内操作还是段间操作。段内操作定义为NEAR类
型(近程操作),段间操作定义为FAR(远程操作)。
存储变量类型属性:对该变量的操作属于什么类型的操作。
BYTE、WORD、DWORD
第 3 章 3.1指令的构成与操作数的类型
3、存储器操作数:
为寻找存储器操作数的物理地址,必须确定操作数所在的段。
一般在指令中不涉及到段寄存器,因为CPU约定了隐含的段寄存
器。例如:取指令用CS寄存器,IP是欲取指令的偏移地址,直接
寻址隐含使用DS等。
段超越:在某些情况下,为进行特定的操作,可以用指定的段寄
存器,代替标准段(隐含段,)寄存器这种情况称为段超越,但
需要在指令中注明指定的段。
MOV AX,ES:[2000H]
第 3 章 3.1指令的构成与操作数的类型
3、存储器操作数:
表3.3
隐含及允许超越的段寄存器
存储器操作数类型
隐 含 段 寄 存 允 许 超 越 段 偏移地址
器(标准) 寄存器
取指令
CS
不允许
IP
堆栈操作指令等
SS
不允许
SP
通用数据读写(间址)除 DS
外
CS 、 SS 、 EA(有效地
ES
址)
字符串处理
源串
DS
不允许
目的串
ES
ES 、 CS 、 DI
DS
SS
ES 、 CS 、 EA
DS
用BP基址寄存器
SI
第 3 章 3.1指令的构成与操作数的类型
总结:
对于上述的三种操作数,何时计算出指令所用操作数的实际
值,各不相同。
立即数在汇编时计算出。
寄存器操作数在装入程序时计算。
存储器操作数在在执行时计算。
对于执行速度:
寄存器操作数的指令执行速度最快,
立即数操作数指令次之,
存储器操作数指令最慢。
第 3 章 3.2
寻址方式
指令代码由操作码字段和操作数字段组成。操作码字段指出指令
的功能,指示计算机所要执行的操作,操作数则指出操作的对象。
指令操作码:在机器里表示时,只需要对每一种操作给定出确定
的二进制代码。
指令操作数:直接给出
操作数地址或地址的一部分
指向操作数地址的地址指针
其它有关操作数的信息
寻址方式:是指令中用以说明操作数所在地址的方法,按什么方
式找到操作数的地址,操作数可以放在寄存器、存储器、I/O端口、
也可以是立即数放在指令代码中。在转移类指令中的寻址方式是要寻
找转移新地址。
第 3 章 3.2
寻址方式
3.2.1 立即寻址(Immediate Adressing)
在指令中直接给出参加操作的8位或16位数据,操作
数包含在指令中,紧跟在操作码的后面,与操作码一起放
在代码区域。
操作码
0AH
7FH
立即寻址方式主要用于给寄
存器或存储单元赋初值。因为操
作数可以直接从指令中获得,不
需要运行总线周期,所以立即数
寻址方式显著特点就是速度快。
注意:立即数只能作源操作数,
不能作目的操作数
;将变量TABLE的偏移量地址送入
AX,变量TABLE已定义,其偏移
地址是一个16位的立即数
第 3 章 3.2
寻址方式
寄存器寻址:操作数放在CPU内部的寄存器中。对于
16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、
SP、BP。而8位数来说,寄存器可以为AH、AL、BH、
BL、CH、CL、DH、DL。
例如:MOV SP,
AX ; 16位操作
指令本身存放在存储器的代码段,而操作数CPU的寄
存器中,取操作数不用访问内存,因此执行速度快。
例如: MOV AH,AL
MOV DL, DH
; 8位操作
第 3 章 3.2
寻址方式
3.2.3 直接寻址(Direct Adressing)
直接寻址:在指令中直接给出参加操作的数据的所在存储单元的16
位的偏移地址。这个偏移地址也称有效地址EA,它与指令操作码一起
存放在内存的代码段,也是低8位在前,高8位在后。操作数存放在内
存的数据段DS区域,段地址隐含放在DS中。
第 3 章 3.2
寻址方式
例如:MOV AX,[2000H]
直接寻址指令中,对于表示有效地址的16位要加方括号。
指令功能:将一个有效地址为2000H的内存单元内容传送给AX。
设 DS=3000H,则
物理地址:3000H X10H+2000H=32000H
AX
地址32000H
第 3 章 3.2
寻址方式
3.2.3直接寻址 (Direct Adressing)
30000H(DSX16)
MOV AX,[2000H];
+ 2000H(偏移地址)
32000H(物理地址)
偏
移
地
址
如果没有特别指明,
直接寻址的操作数
在数据段。
30H 50H
物理地址的形成及指令的执行过程
第 3 章 3.2
寻址方式
如:设DS=1000H,ES=2000H,EA=100H,[10100H]=01H,[20100H]=0AH,则
MOV AL,[100H] ; AL=01H
MOV AL,ES:[100H] ; AL=0AH,这是段跨越,在指令中要说明。
段寄存器名:[偏移量数值]
MOV ES:[2000H],AX;
把AX的内容送扩展段ES存储单元且偏移地址为2000H
第 3 章 3.2
寻址方式
在汇编语言中,若存储变量已定义,允许用该变
量代替操作数的偏移地址,如存储变量为BUFFER把
变量所对应的存储单元的内容16位送BX中:
MOV BX,[BUFFER];也是直接寻址方式
MOV BX,BUFFER
第 3 章 3.2
寻址方式
在直接寻址方式中,规定两个操作数
一个必须寄存器操作数,不允许两个操作
数同为存储器操作数。
第 3 章 3.2
寻址方式
3.2.4 寄存器间接寻址
寄存器间接寻址:指令中的操作数存放在存储器中,存储单
元的有效地址(EA)由寄存器指出。
操作数是存储器操作数,其偏移地址放在寄存器中,且只有
BX、SI、DI、BP才能使用。当用的是BX、SI、DI时,段地址隐
含放在DS中,当用的是BP时,段地址隐含放在SS中。
BX
SI
EA=
隐含段地址DS
DI
BP
隐含段地址SS
第 3 章 3.2
寻址方式
3.2.4 寄存器间接寻址(Register Indirect Adressing)
1、 BX、SI、DI进行寄存器间接寻址( BX、SI、DI 作为地址指针)
当用的是BX、SI、DI时,段地址隐含放在DS中,操作数存放在现行的
数据段中。
操作数的物理地址=DS X 16 + EA
MOV AL,[BX]
MOV AL,[SI]
MOV AL,[DI];均是合法的指令,
MOV AL,[DX]
MOV AL,[CX];是非法指令
如:设:DS=2000H,
BX=100H,
SI=110H,
DI=111H,
[20100H]=34H,
[20110H]=56H,
[20111H]=78H,则有:
第 3 章 3.2
寻址方式
3.2.4 寄存器间接寻址(Register Indirect Adressing)
第 3 章 3.2
寻址方式
2、BP进行寄存器间接寻址(BP作为地址)
当用的是BP时,段地址隐含放在堆栈段寄存器SS中。
物理地址=SS*16+BP。
MOV [BP],BX;物理地址=SSx16+BP
第 3 章 3.2
寻址方式
3.2.4 寄存器间接寻址(Register Indirect Adressing)
2、BP进行寄存器间接寻址(BP作为地址)
第 3 章 3.2
寻址方式
3.2.5 变址寻址(Indexd Adressing)
变址寻址方式中用SI、DI变址寄存器进行间接寻址,操作数在存
储单元中,操作数的物理地址是由寄存器的内容加上变址寄存器SI或
DI的内容,再加上由指令中所指出的16位或8位的位移量disp而得到的。
其寻址的有效地址可表示为:
SI
EA=
或
DI
+ disp
Disp-----16位或8位
的位移量,它是16
位或8位的无符号数。
第 3 章 3.2
寻址方式
表示:MOV AX, 3003H[SI]
MOV AX, [SI]+3003H
MOV AX, [SI+ 3003H ]
几种表示形式
第 3 章 3.2
寻址方式
设DS=3000H,
SI=2000H,指令
3.2.5 变址寻址(Indexd
中3003H为位移Adressing)
量disp
物理地址=DS X 16 + EA
=30000H+2000H +3003H
第 3 章 3.2
寻址方式
3.2.6 基址寻址(Based Adressing)
基址寻址与变址类似,不同之处在于基址指令中使用基址BX或基
址指针寄存器BP,而不是使用变址寄存器SI和DI。
注意:BX
BP
隐含段寄存器DS
隐含段寄存器SS 允许段超越
BX
EA=
或
BP
+
Disp-----16位或8位
disp 的位移量,它是16
位或8位的无符号数。
第 3 章 3.2
寻址方式
物理地址=(DS或SS等)X 16 + EA
=30000H+2000H +3003H
表示:MOV SI, O8H[BX]
;物理地址=DSx16+BX+08H
MOV AX, [BX+100H] ;物理地址=DSx16+BX+100H
MOV [BP]+0200H , AX ;物理地址=SSx16+BP+0200H
第 3 章 3.2
寻址方式
3.2.6 基址寻址(Based Adressing)
第 3 章 3.2
寻址方式
3.2.7 基址、变址寻址(Based Idexed Adressing)
将基址寻址与变址寻址联合起来的方式,称为基址、变址寻址方式。
这种寻址方式,操作数在存储单元。
BX
EA=
或
SI
+
BP
或
+ disp
Disp-----16位或8位
的位移量,它是16
位或8位的无符号数。
DI
物理地址=(DS 或SS等)X 16 + EA
注意:BX
BP
隐含段寄存器DS
隐含段寄存器SS 允许段超越
第 3 章
3.2.7 基址、变址寻址(Based Idexed Adressing)
第 3 章 3.2
BX
寻址方式
第 3 章 3.2
寻址方式
表示:MOV AX, [BX+MASK] [SI];
MOV AX, [BX+ SI + MASK];
MOV AX, [BX] MASK [SI];
MOV AX, MASK [BX] [SI];
代表同一条指令
第 3 章 3.2
寻址方式
注意:不允许将两个基址寄存器或两个变址寄存器组合一起。
MOV AX, MASK [BX] BP];(x)
MOV AX, MASK [SI][DI];(X)
第 3 章 3.2
寻址方式
3.2.8 隐含寻址
在8086/8088指令系统中,有的指令的操作码不仅包含指令的操作
属性,而且还隐含着部分操作数的地址。也就是说,指令执行时要用
到的部分操作数地址,在指令的机器码中没有特别指明,这个地址是
隐含。
操作数在指令中没有直接出现,而是隐含存在。如:CLC(将标
志位CF置为0)、MOVSB(串传送指令)等。
MUL CH;
AX
AL*CH