汇编语言课件.docx
《汇编语言课件.docx》由会员分享,可在线阅读,更多相关《汇编语言课件.docx(72页珍藏版)》请在冰豆网上搜索。
汇编语言课件
汇编语言的特点:
Ø面向机器的低级语言,通常是为特定的计算机或计算机系列专门设计的。
Ø保持了机器语言的优点,具有直接和简捷的特点。
Ø可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。
Ø目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。
Ø经常与高级语言配合使用,应用十分广泛。
第一章基础知识
教学目的和要求:
Ø熟练掌握进位计数制和各种进位计数制之间的数制转换
Ø掌握计算机中数和字符的表示方法
教学重点:
Ø二进制数和十六进制数运算
教学难点:
Ø十六进制数的运算
1.1进位计数制与不同基数的数之间的转换
1.1.1二进制数转换为十进制数
方法:
按权展开
例如:
1010110.1011B=26+24+21+2-1+2-3+2-4
1.1.2十进制转换为二进制数
方法:
整数部分:
除基取余,自底向上
小数部分:
乘基取整,自顶向下
例如:
N=130D,求其对应的二进制数
130D=10000010B
1.1.3十六进制数及其与二进制、十进制之间的转换
1.十六进制数←→二进制数
例如:
3B2H=10110110010B
1001001101B=24DH
2.十六进制数←→十进制数
3B2H=3×162+11×161+2×160
23D=17H
1.2二进制数和十六进制数的运算
1.2.1二进制数运算
逢二进一借一为二
加法规则乘法规则
0+0=000=0
0+1=101=0
1+0=110=0
1+1=0(进位1)11=1
1.2.2十六进制数运算
1.加法和减法
逢十六进一借一为十六
2.乘法
化为十进制数,求得结果后再化为十六进制数
1.3计算机中数和字符的表示
1.3.1数的补码表示
规则:
正数的补码等于原码
负数的补码等于其绝对值的原码各位取反然后末位加一
如:
-36D,机器字长为16位,求其补码
36的原码为0000000000100100
按位取反:
111111*********1
末位加一:
111111*********0
1.3.2补码的加法和减法
加法规则:
[X+Y]补码=[X]补码+[Y]补码
减法规则:
[X-Y]补码=[X]补码+[-Y]补码
例如:
机器字长为8,求[32-17]补,[32+6]补
[32-17]补:
00100000
+11101111
=00001111
[32+6]补:
00100000
+00000110
=00100110
注:
补码减法可转换为补码加法
进位和溢出
进位:
由于运算结果超出了位数,最高有效位向前的进位,这一位自然丢失,一般不表示结果的对错。
溢出:
表示结果超出了字长允许表示的范围,一般会造成结果出错。
1.3.3无符号数
1.3.4字符表示法
ASCII码:
用一个字节来表示一个字符,低7位为字符的ASCII值,最高位一般用作校验位。
1.4几种基本的逻辑运算
第二章80x86计算机组织
教学目的和要求:
Ø熟练掌握中央处理器的组成,以及存储器的寻址方式等。
教学重点:
ØCPU的组成、8086寄存器组、以及实模式存储器寻址
教学难点:
Ø8086寄存器组、实模式存储器寻址
2.180x86微处理器
由80386微处理器芯片构成的微机称为386微机,由80486微处理器芯片构成的微机称为486微机,P15表2.1反映出从8086~PentiumII的一些主要技术参数,大家可通过它了解一下CPU的发展历程。
2.2基于微处理器的计算机系统构成
2.2.1硬件
运算器:
所有算术与逻辑运算
控制器:
全机控制工作,从存储器中取出指令,经译码分析后向全机发出取数、执行、存数等控制指令。
存储器:
计算机的记忆部件
I/O设备:
负责与外界通信的输入、输出设备,如显示器、键盘等
大容量存储器:
可存储大量信息的外部存储器,如磁盘、光盘等
数据线:
传送信息
地址线:
指出信息来源和目的地
控制线:
规定总线的动作
注:
系统总线的工作由总线控制逻辑指挥
2.2.2软件
软件系统包括:
系统软件和应用软件。
2.3中央处理机
2.3.1中央处理器CPU的组成
算术逻辑部件
控制逻辑
工作寄存器
386后出现了高速缓冲存储器
2.3.280x86寄存器组
寄存器是运算器中的存储单元。
分为:
程序可见的寄存器(在汇编语言程序设计中用到的寄存器)
程序不可见的寄存器(程序设计不可用,由系统调用的)
程序可见的寄存器包括:
通用寄存器,专用寄存器,段寄存器
1、通用寄存器
(1)数据寄存器(AX、BX、CX、DX)
用来暂时存放计算过程中所用到的操作数、结果或其它信息,可以以字(16位)也可以以字节(8位)的形式访问。
以AX为例:
(2)指针(或变址)寄存器(SP、BP、SI、DI)
运算过程中存放操作数,只能以字(16位)为单位使用;存储器寻址时,提供偏移地址。
ØSP(堆栈指针寄存器)
用来指示段顶的偏移地址;
ØBP(基址指针寄存器)
可作为堆栈区中的某一个基地址,与堆栈段寄存器SS联用来确定堆栈段中的某一存储单元的地址;
ØSI(源变址寄存器)和DI(目的变址寄存器)
一般用来确定数据段中某一存储单元的地址。
2、专用寄存器(IP、SP、FLAGS)
ØIP(指令指针寄存器)
存放代码段CS中的偏移地址。
在程序运行的过程中,始终指向下一条指令的首地址,与代码段CS联用来确定下一条指令的物理地址。
ØSP(堆栈指针寄存器)
与堆栈段寄存器SS联用来确定堆栈段中栈顶的地址,即存放栈顶的偏移地址。
ØFLAGS(标志寄存器/程序状态寄存器PSW)
包括条件码标志、控制标志、系统标志,可按位操作。
图2.480X86的标志寄存器
(1)条件码标志位
记录程序中运行结果的状态信息,根据有关指令的运行结果由CPU自动设置,用作后续条件转移指令的转移控制条件。
①溢出标志(OF)
在运算过程中,如操作数超出了机器能表示的范围称为溢出。
此时OF置1,否则置0。
②符号标志(SF)
记录运算结果的符号,负时置1,否则置0。
③零标志(ZF)
运算结果为0时置1,否则置0。
④进位标志(CF)
最高有效位有进位时置1,否则置0。
⑤辅助进位标志(AF)
记录运算时第3位产生的进位值,有进位时置1,否则置0。
⑥奇偶标志(PF)
用来为机器中传送信息时可能产生的代码出错情况提供检验条件。
当结果操作数中1的个数为偶数时置1,否则置0。
(2)控制标志位
①方向标志(DF)
在串处理指令中控制处理信息的方向。
当DF为1时,每次操作后使变址寄存器SI和DI减小,串处理从高地址向低地址方向处理。
当DF为0时,每次操作后使变址寄存器SI和DI增大,串处理从低地址向高地址方向处理。
(3)系统标志位
用于I/O、中断屏蔽、程序调试、任务切换和系统工作方式等的控制。
一般应用程序不必关心这些位,只有系统程序员或需要编制低层I/O设备控制等程序时才需要。
①陷阱标志(TF)
用于调试时的单步方式操作。
TF为1时,每条指令执行完后产生陷阱,由系统控制计算机;TF为0时,CPU正常工作,不产生陷阱。
②中断标志(IF)
当IF为1时,允许CPU响应可屏蔽中断请求,否则关闭中断。
(第八章)
③I/O特权级(IOPL)
在保护模式下,用于控制对I/O地址空间的访问。
(第八章)
(4)标志位的符号表示
表2-1标志位的符号表示
标志名
标志为1
标志为0
OF溢出(是/否)
DF方向(减量/增量
IF中断(允许/关闭)
SF符号(负/正)
ZF零(是/否)
AF辅助进位(是/否)
PF奇偶(偶/奇)
CF进位(是/否)
OV
DN
EI
NG
ZR
AC
PE
CY
NV
UP
DI
PL
NZ
NA
PO
NC
3.段寄存器(放在2.4.2中讲解)
段寄存器:
用于存放段地址的寄存器。
8086/8088,80286中的段寄存器包括:
代码段寄存器:
CS
数据段寄存器:
DS
堆栈段寄存器:
SS
附加段寄存器:
ES
80386以后增加了FS,GS,它们也是附加段寄存器。
2.4存储器
2.4.1存储单元的地址和内容
1.存储单元的地址
物理地址:
在存储器里以字节为单位存储信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址。
说明:
Ø地址从0开始编号,顺序地每次加1。
Ø在机器里,地址用无符号的二进制数表示,当常以无符号十六进制数做为书写格式。
思考:
地址总线分别为20位、24位、32位、36位时,可访问的单元地址范围。
2.存储单元的内容
Ø存储单元的内容:
一个存储单元中存放的信息,书写格式为:
(地址)=内容
例如:
(0004)=34H
Ø字数据存储时,低位字节存入低地址,高位字节存入高地址,这样两个字节单元构成一个字单元,字单元地址以它的低地址表示。
同理,双字数据存放在连续的4个存储单元内。
例如:
(0023H)=1234H
Ø同一地址既可以看作字节单元地址,也可以看作字单元地址或双字单元、四字单元地址。
Ø访问存储器时以字为单位进行,即机器以偶地址访问存储器,对于奇地址字单元需访问两次存储器。
Ø设X为某存储单元地址,则(X)表示该单元的内容,如果X的内容仍然为一个地址Y,则Y的内容表示为((X))。
例如:
(0004H)=1234H,(1234H)=231EH,则((0004H))=231EH。
2.4.2实模式存储器寻址
1.存储器地址的分段
为何要进行分段?
分段的目的:
解决16位字长的机器无法直接表示20位地址的问题。
机器规定:
从0地址开始,每16个字节为一小段。
如下:
00000,00001,00002,……,0000F;
00010,00011,00012,……,0001F;
………………;
FFFF0,FFFF1,FFFF2,……,FFFFF
分段方法:
对存储器分段时,段可以起始于任意小段的首地址,而不是任意地址,段的大小可以是1B~64KB的任意个字节。
物理地址:
在1M的存储器里,每个存储单元都有一个唯一的20位地址,称为该单元的物理地址。
段地址:
每一段的起始地址,由于该地址的最低4位为0,故只取高16位。
偏移地址:
段内相对于段起始地址的偏移量。
例如:
设段地址为1200H,则下图中内存单元内容为56H的存储单元偏移地址为0003H。
物理地址的计算方法:
物理地址=段地址×16+偏移地址
例如:
段地址为1234H,偏移地址为0002H,求其物理地址。
1234H×16+0002H=12342H
注:
每个存储单元都有唯一的物理地址,但可由不同的段地址和不同的偏移地址构成。
例如:
下列地址对应同一物理地址。
段地址为2000H,偏移地址为003DH
段地址为2003H,偏移地址为000DH
2.段寄存器
段寄存器:
专门存放段地址的寄存器。
包括:
(1)代码段CS:
存放当前正在运行的程序;
(2)数据段DS:
数据段存放当前运行程序所用的数据,如果程序中使用了串处理指令,则其源操作数也存放在数据段中;
(3)堆栈段SS:
堆栈段定义了堆栈的所在区域;
(4)附加段ES:
附加段是附加的数据段,它是一个辅助的数据区,也是串处理指令的目的操作数存放区;
在80386及其后继的80X86中新增段寄存器
(1)FS
(2)GS
2.4.3保护模式存储器寻址(略)
2.5外部设备
外部设备与主机(CPU和存储器)的通信通过外设接口进行,每个外设接口包括一组寄存器,一般有三种不同的用途:
①数据寄存器:
存放在外设和主机间传送的数据,起缓冲器的作用。
②状态寄存器:
保存外部设备或接口的状态信息,以便CPU了解和测试外设的工作情况。
③命令寄存器:
CPU给外设或接口的控制命令。
注:
Ø各种外部设备都有以上三种类型的寄存器,只是每个接口所配备的寄存器数量不同。
Ø外设中的每个寄存器都有一个端口(port)地址(端口号),组成了独立于内存的I/O地址空间。
第三章80x86的指令系统和寻址方式
教学目的和要求:
Ø熟练掌握8086的寻址方式
Ø熟练掌握8086的指令系统
教学重点:
Ø8086的指令系统和寻址方式
教学难点:
Ø寻址方式的理解,各指令的用法
指令系统的一般格式:
操作码操作数,操作数,……,操作数
一地址指令:
只有一个操作数
二地址指令:
有二个操作数,
常见格式为:
操作码目的操作数,原操作数
三地址指令:
有三个操作数
3.180x86的寻址方式
操作数可存放的位置:
Ø立即数
Ø寄存器中
Ø存储器中
3.1.1与数据有关的寻址方式
1、立即寻址方式
操作数直接存放在指令中。
如:
MOVAX,10A7H;源操作数的寻址方式为立即寻址
MOVAL,87H
注:
常用来表示常数,只能用于源操作数,不能用于目的操作数。
2、寄存器寻址方式
操作数存放在CPU内部的寄存器中,指令指定寄存器号。
如:
MOVAX,BX
INCCX
ADDBL,7;目的操作数的寻址方式为寄存器寻址方式
注:
16位操作数,可用AX,BX,CX,DX,SP,BP,SI,DI
8位操作数,可用AL,AH,BL,BH,CL,CH,DL,DH
(除了上述两种寻址方式外,其他的寻址方式中操作数均保存在存储器中,介绍之前先学习几个定义)
有效地址(EA:
EffectiveAddress):
即偏移地址
可由以下四部分组成:
位移量:
存放在指令中的一个8位,16位或32位的数或符号地址。
基址:
存放在基址寄存器中的内容。
(常用于指向数据段中数组或字符串的首地址)
变址:
存放在变址寄存器中的内容。
(常用于访问数据段中数组的某个元素或字符串的某个字符)
比例因子:
用于386及以后机型,可以是1,2,4,8,常用于访问数组。
8086~80286有效地址的组成部分:
位移量
8,16位
基址寄存器
BX,BP
变址寄存器
SI,DI
比例因子
无
有效地址的计算公式:
EA=基址+变址+位移量
386以后:
EA=基址+变址×比例因子+位移量
3、直接寻址方式
数据在存储器中,有效地址由指令直接给出。
EA=位移量
注:
有效地址就是偏移地址。
如:
MOVAX,[1008H]
则:
执行完后:
(AX)=1234H
注:
1.可用符号地址(类似于变量名)代替数值地址。
如
MOVAX,VALUE或者MOVAX,[VALUE]
2.有效地址直接给出,段地址默认为数据段。
若访问其他段的数据,需加段跨越前缀。
MOVAX,ES:
[1008H]
3.字数据存放在存储器中时,高地址存放在高字节,低地址存放在低字节。
4、寄存器间接寻址
基址寄存器:
BX,BP
变址寄存器:
SI,DI
操作数在存储器中,有效地址为基址寄存器或变址寄存器的内容。
即:
EA=基址/变址
如:
MOVAX,[BX]
设(DS)=3000H,(BX)=2000H,(32000H)=12H,(32001H)=34H
则:
EA=(BX)=2000H
物理地址=32000H
执行后:
(AX)=3412H
注:
当基址寄存器用BP时,默认段为SS,否则为DS。
该规则在以后的几种寻址方式中同样适用。
如:
MOVAX,[BP]
(DS)=3000H,(SS)=2000H,(BP)=2000H
则:
物理地址=22000H
5、寄存器相对寻址
EA=基址/变址+位移量
如:
(1)MOVAX,[BP+1000H]
(2)MOVAX,COUNT[BX]或MOVAX,[BX+COUNT]
COUNT为位移量。
如果(DS)=3000H,(SS)=2000H,(BP)=2000H,(BX)=3120H,COUNT=0040H
则:
(1)物理地址=23000H
(2)物理地址=33160h
6、基址变址寻址方式
EA=基址+变址
如:
MOVAX,[BX][SI]或MOVAX,[BX+SI]
7、相对基址变址寻址方式
EA=基址+变址+位移量
如:
MOVAX,COUNT[BX][DI]或MOVAX,[BX+DI+COUNT]
(注意:
教材43-44,8-10的寻址方式为386以后机型增加的寻址方式,在此不再介绍。
)
3.1.2与转移地址有关的寻址方式(略)
3.2程序占用的空间和执行的时间(略)
补充:
汇编语言的编写及调试运行过程
1、汇编语言源程序的基本格式
注:
Ø程序必须有代码段,而数据段、附加段、堆栈段只有必要时才有。
Ø用ASSUME将我们定义的各段与段寄存器相对应。
Ø在程序开始时,应将除代码段以外的其余各段的段地址赋给相应的段寄存器。
Ø程序结束时要有返回DOS的语句。
2、程序调试过程
1、编辑.ASM汇编语言源程序。
(在DOS下可用EDIT编写)
EDITA.ASM
2、用MASM对源程序汇编,产生.OBJ的目标文件。
MASMA.ASM或MASMA;
注:
如果提示有语法错误,则不产生.OBJ文件,此时我们要返回第1步修改源程序。
3、用LINK对.OBJ文件进行连接,产生.EXE的可执行文件。
LINKA.OBJ或LINKA;
4、执行.EXE可执行文件,或者用DEBUG对.EXE文件进行调试。
执行:
A
调试:
DEBUGA.EXE
3、DEBUG常用指令简介
1、U(反汇编)命令
格式:
U或U地址或U地址1地址2
功能:
从代码段中指定地址进行反汇编
常用方式:
U 从上次结束的位置进行反汇编
U地址 从指定地址开始进行反汇编
2、G(执行)命令
格式:
G[=地址1][地址2]
功能:
从地址1开始执行到地址2,或执行到程序结束。
常用方法:
G 从当前位置执行到程序结束
G地址 从当前位置执行到指定地址
3、T(跟踪)命令
格式:
T[=地址1][数值N]
功能:
从地址1起执行N条指令后停止。
常用方法:
T 仅执行当前一条指令
4、D(显示)命令
格式:
D[地址]或D[地址1地址2]
功能:
显示指定内存单元的内容
常用方法:
D地址 从指定地址开始显示内存单元的内容
注:
如果地址仅仅是偏移地址,则系统默认为数据段。
5、R(寄存器)命令
格式:
R[寄存器名]
功能:
显示指定寄存器的值
常用方法:
R 显示所有寄存器的值
6、Q(退出)命令
格式:
Q
3.380x86的指令系统
学习汇编语言指令应该把握以下几点:
①汇编指令的共性
·双操作数指令中,两个操作数不能同为存储单元,也不能同为段寄存器,目的操作数不能为立即数。
·单操作数指令中,操作数可以是除立即数以外的任何寻址方式
②指令对标志寄存器的影响
③各指令的格式、使用方法和注意事项
1、传送指令
1)通用传送指令
包括:
MOV、PUSH、POP、XCHG
①MOV最基本的传送指令
格式:
MOV DST,SRC
执行的操作:
(DST)←(SRC)
说明:
Ø目的操作数不能为CS和IP
Ø传送的数据可以是8位或16位,取决于操作数的形式
Ø源操作数的长度应该小于或等于目的操作数的长度
Ø所有通用传送指令都不改变标志位
例如:
MOVAX,BX √
MOVAX,[BX] √
MOV[AX],[0000H]×
MOVVALUE,24H √
MOVCS,1243H ×
②PUSH、POP堆栈操作指令
·PUSH进栈指令
格式:
PUSHSRC
执行的操作:
(SP)←(SP)-2
((SP)+1,(SP))←(SRC)
·POP出栈指令
格式:
POPDST
执行的操作:
(DST)←((SP)+1,(SP))
(SP)←(SP)+2
说明:
ØPUSH和POP是字操作
Ø操作数为除立即数以外的任何形式
ØPOP指令不能用CS
Ø常用于对寄存器值的保存和恢复
③交换指令XCHG
格式:
XCHGOPR1,OPR2
操作:
(OPR1)←→(OPR2)
说明:
ØOPR表示操作数
Ø两操作数中至少有一个为寄存器,但不能为段寄存器或IP
Ø允许字/字节操作
如:
XCHGAX,BX √
XCHGAX,[0011H]√
XCHGBX,1 ×
XCHGBX,CS ×
2)累加器专用传送指令
包括:
INOUTXLAT
这组指令只限于使用AX或AL传送信息。
用于与外设直接的数据传递。
①IN输入指令
长格式:
INAL,PORT(字节)
INAX,PORT(字)
执行的操作:
(AL)←(PORT)(字节)
(AX)←(PORT+1,PORT)(字)
短格式:
INAL,DX(字节)
INAX,DX(字)
执行的操作:
(AL)←((DX))(字节)
(AX)←((DX)+1,(DX))(字)
②OUT输入指令
长格式:
OUTPORT,AL(字节)
OUTPORT,AX(字)
执行的操作:
(PORT)←(AL)(字节)
(PORT+1,PORT)←(AX)(字)
短格式:
OUTDX,AL(字节)
OUTDX,AX(字)
执行的操作:
((DX))←(AL)(字节)
((DX)+1,(DX))←(AX)(字)
说明:
ØIN指令:
I/O→AL或AX
ØOUT指令:
AL或AX→I/O
ØI/O设备中前256个端口(0-FFH)端口号可使用长格式直接在指令中指定。
Ø端口号>FFH时,只能用短格式。
例如:
写出下列指令:
把端口34H的字数据送到存储单元str中。
INAX,34H
MOVSTR,AX
或者:
MOVDX,34H
INAX,DX
MOVSTR,AX
把端口2AFH的字节数据送到存储单元str1中。
MOVDX,2AFH
INAL,DX
MOVSTR1,AL
把存储单元STR中的字数据送到端口28H中。
MOVAX,STR
OUT28H,AX
或:
MOVAX,S