《汇编语言》》word版文档格式.docx
《《汇编语言》》word版文档格式.docx》由会员分享,可在线阅读,更多相关《《汇编语言》》word版文档格式.docx(80页珍藏版)》请在冰豆网上搜索。
注:
汇编程序:
能够将汇编源程序翻译成目标程序(机器语言)
●汇编语言的特点:
①所占空间、执行速度与机器语言相仿
② 直接、简捷,能充分控制计算机的硬件功能
1.2Intel8086微处理器简介
通用寄存器:
AX(累加器)
BX(基址寄存器)
CX(计数器)
DX(数据寄存器) ;
可以分8位使用。
指针及变址寄存器:
SP(堆栈指针寄存器)
BP(基址指针寄存器)
SI(源变址寄存器)
DI(目的变址寄存器)
IP(指令指针寄存器):
用来存放下一条要执行指令在内存中代码段中的偏移地址。
1.3主存储器和堆栈
1、主存储器
●主存的基本存储单位是位(bit),它能容纳一个二进制数的0或1
●字节编址:
以字节为最小寻址单位。
●8086的最大寻址空间1M
●字的存放形式“低位在前,高位在后”
00000H
00200H
00201H
00202H
FFFFFH
56H
34H
12H
00200H起 取一个字得 3412H
00201H起 取一个字得 5634H
●“对准字”和“不对准字”
2、堆栈
在内存中开辟出一片存储区,采用一端固定,另一端活动的方式存取数据。
堆栈的图示:
栈顶 SP:
指向最后存入的数据的单元
栈底
●进栈指令 PUSH
PUSHOPS
SP
SP
功能:
将寄存器、段寄存器或存储器中的一个字数据压入堆栈。
(SP)-2→SP
假设(SP)=1000H(AX)=1234H
PUSHAX
(SP)=0FFEH
注:
PUSHAL;
错误
PUSH0003H;
●出栈指令 POP
POPOPD
将栈顶元素(字)弹出送至寄存器、段寄存器(CS除外)或存储器中。
(SP)+2→SP
设 (BX)=2004H
POPBX
执行后:
(BX)=1234H(SP)=1000H
PUSHCS;
正确
POPCS;
3、存储器的分段管理
●地址表示的一对矛盾:
直接寻址能力为1M(
字节);
而寄存器是16位结构的。
●解决方法:
引入了存储器“分段”的概念,即把1M字节内存空间分成若干段。
每段最大可达64K字节--可由16位寄存器进行寻址。
段的起始地址成为“段基址”,要访问的单元距段基址的距离(字节数)为“偏移量”(Offset)。
…
段的起始地址
偏移量
要访问的单元
段
程序设计时,使用的是逻辑地址。
逻辑地址由“段基址”和“偏移量”构成(均为16位)。
“段基址”由段寄存器CS、DS、SS和ES提供;
“偏移量”由BX、BP、IP、SP、SI、DI或根据寻址方式计算出的有效地址EA(EffectiveAddress)提供。
●注意:
①每个存储单元有唯一的物理地址,但它却可由不同的“段基址”和“偏移量”组成。
例如:
1200H:
0345H→12345H1100H:
1345H→12345H
②除非专门指定,一般情况下,段在存储器中的分配是由操作系统负责的。
例1:
设(CS)=8000H(IP)=0100H
问下一条要执行的指令的物理地址PA?
(CS)内容左移4位+(IP)
PA=80000H+0100H=80100H
例2:
设(DS)=1000H该数据段中偏移量为0200H处的物理地址PA?
(DS)内容左移4位+偏移量
PA=10000H+0200H=10200H
例3:
设(SS)=1000H(SP)=2000H问该堆栈段栈顶的的物理地址PA?
(SS)内容左移4位+(SP)
PA=10000H+2000H=12000H
1.4数值数据在机器内的表示形式
8086的两个规定:
1数值数据均指无符号定点数
2有符号数则一律采用n位二进制补码表示。
例1:
设M=14=0EH
[M]补=0EH
1
机器内:
扩展成16位后:
[M]补=000EH
例2:
设M=-14=-0EH
[M]补=0F2H
[M]补=0FFF2H
注:
最高位(符号位)向左扩展若干位后,仍是该数的补码。
●8086中,16位补码的表示范围:
7FFFH~~8000H
机器在进行算术运算时,总是把参加运算的用补码表示的操作数作为无符号数处理。
1.5字符数据在机器内的表示形式
1、ASCII码(美国信息标准交换码)
●字符数据是以ASCII码形式存放在内存中的。
例如“1”就是31H
“A”就是41H
2、BCD码
定义:
利用二进制形式来表示十进制数。
利用4位二进制数(0000B~1001B)来表示十进制数(0~9)
例如:
19=00011001BCD
=000010011B
●压缩BCD(组合BCD)一个字节存放两个十进制数位
例如19
非压缩BCD(非组合BCD)一个字节存放一个十进制数位
例如19
这种情况下,高四位全零;
低位在前,高位在后。
CF
PF
AF
ZF
SF
TF
IF
DF
OF
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.6标志寄存器
1、状态标志:
表示前面的操作执行后,算术逻辑部件处于怎样一种状态。
例如,是否产生了进位,是否发生了溢出等等。
程序中,可以通过对某个状态标志的测决
定后面的走向及操作。
例如:
STATE:
INAL,0DAH;
TESTAL,02H;
JZSTATE
●零标志ZF(ZeroFlag):
若运算结果为0,则ZF=1;
否则ZF=0。
例1:
MOVAL,4
SUBAL,4
XORAX,AX
执行后,ZF也一定为1。
●进位标志CF(CarryFlag):
它反映:
加法时,最高位(字节操作时的D7位,字操作时的D15位)是否有进位产生。
减法时,最高位(字节操作时的D7位,字操作时的D15位)是否有借位产生。
MOVAL,3;
SUBAL,4;
执行后,CF=1。
●奇偶标志PF(ParityFlag):
若运算结果低8位中“1”的个数为偶数,则PF=1;
否则PF=0。
例:
MOVAL,2
ADDAL,1
执行后,PF位为1。
●辅助进位标志AF(AuxiliarycarrryFlag):
也称“半进位标志”,它反映:
加法时,第3位向第4位有进位;
减法时,第3位向第4位有借位。
●溢出标志OF(OverflowFlag):
若运算过程中发生了“溢出”,则OF=1。
定义:
运算结果超出计算装置所能表示的范围,称为溢出。
判断方法之一【逻辑】:
溢出=最高位进位⊕次高位进位
分析执行下述两条指令后,以上六个标志位的变化。
MOVBL,58H
ADDBL,4AH
解:
01011000B
+01001010B
10100010B
CF=0SF=1OF=1PF=1ZF=0AF=1
2、控制标志(3位):
每一位控制标志都对一种特定的功能起控制作用。
可以通过专门的指令对其进行“置位”(Set)或“复位”(Reset)。
●中断标志IF(InterruptEnableFlag):
如果IF置“1”,则CPU可以接受可屏蔽中断请求;
反之,则CPU不能接受可屏蔽中断请求。
指令系统中有两条专门的指令可以置“1”或置“0”IF标志位:
STI使IF置“1”,即开放中断。
CLI使IF清“0”,即关闭中断
●方向标志DF(DirectionFlag):
用于串操作指令中的地址增量修改(DF=0)还是减量修改(DF=1)。
STD
CLD
●跟踪标志TF(TrapFlag):
若TF=1,则CPU按跟踪方式(单步方式)执行程序。
4、标志位寄存器的操作
●传送
LAHF
将标志位寄存器的低8位送入AH中,即:
(FLAGS)7~0→AH
执行前(FLAGS)=0485H(AX)=0FFFFH
执行后(FLAGS)=0485H(AX)=85FFH
SAHF
将AH的内容送入标志位寄存器的低8位中,即:
AH→(FLAGS)7~0
●栈操作
PUSHF
POPF
MOVAX,0FFFFH
PUSHAX
结果:
(FLAGS)=0FFFFH
1.7常用指令简介
源操作数
目的操作数
操作码
MOVAX,BX
将BX中的内容放到AX中
其他指令:
ADDAX,100
SUBAX,100
INCAX
DECBX
第二章、寻址方式
教学目的与要求
熟练掌握六种寻址方式(立即方式、直接方式、寄存器方式、寄存器间接方式、变址万式基址加变址方式〕的汇编格式、功能及使用方法。
教学内容
1、寻址方式的基本概念。
2、六种寻址方式的汇编格式、功能及使用方法。
3、寻址方式的应用。
考核知识点与考核要求
六种寻址方式的汇编格式、功能及使用方法,比较各种寻址方式的应用场合,要求达到“掌握”层次。
所谓寻址方式:
就是寻找操作数存放地址的方式。
2.1立即寻址(Immediateaddressing)
指令中直接给出操作数,操作数紧跟在操作码之后,作为指令的一部分存放在代码段里,在取出指令的同时也就取出了操作数,立即有操作数可用,所以称之为立即寻址。
MOVAL,80H
MOVAX,306AH
●立即数可以为8位,也可以为16位。
如果是16位数,则“高位字节存放在高地址中,
低位字节存放在低地址中。
”
●立即寻址方式常用于给寄存器赋值,并且只能用于源操作数,而不能用于目的操作数
2.2寄存器寻址(Registeraddressing)
操作数在寄存器中,指令中指明寄存器号,这种寻址方式叫寄存器寻址。
●对于8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH,DL
●对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP和BP
MOVAL,BL
INCBX
(1)操作数就在寄存器中,不需要访问存储器来取得操作数(指令执行时,操
作就在CPU的内部进行),因而执行速度快。
(2)寄存器号比内存地址短
*在编程中,如有可能,尽量使用这种寻址方式的指令。
*寄存器寻址方式既可用于源操作数,也可用于目的操作数,还可以两者都用于寄存器寻址方式(如MOVBX,AX)
2.3直接寻址(DirectAddressing)
●在讨论寻址方式时,通常把操作数的偏移地址称为有效地址EA(EffectiveAddress),EA可通过不同的寻址方式来得到。
●在直接寻址方式中,指令中直接给出操作数的有效地址,或者说,有效地址EA就在指令中。
它(操作数的有效地址,而不是操作数本身)存放在代码段中指令的操作码之后,但操作数一般存放在数据段中。
例1MOVAX,ds:
[2000H];
ds:
跨段前缀
如(DS)=3000H,则PA=3000H*16d+2000H
例2MOVAX,BUFA;
BUFA为一变量名,这时可以不加跨段前缀,默认为DS
例3下面是运用跨段前缀的一些语句:
MOVAX,ES:
[1000H]
MOVBX,SS:
[0100H]
2.3寄存器间接寻址(RegisterindirectAddressing)
●采用寄存器间接寻址方式时,指令中给出寄存器号(寄存器为BX,BP,SI和DI之一),
被指定的寄存器中存放着操作数的有效地址,操作数在存储器中
●以寄存器的内容为操作数的有效地址
●格式:
[R]
●只有下面四个寄存器:
[BX]……..对应段寄存器为DS
[BP]……..…………………SS
[SI]…………………………..DS
[DI]………………………….DS
MOVAX,[BX];
设(DS)=2000H,(BX)=1000H
物理地址PA=20000H+1000H=21000H
21000H
BX
数据段
5AH
30H
指令的执行结果为:
(AX)=5A30H
指令中也可以通过“段跨越前缀”取得其他段中的数据.
MOVAX,ES:
[BX]
2.4变址寻址(IndexedAddressing)
●操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和。
[R+X]或X[R][X+R]
●若没有段跨越前缀,则对于寄存器BX,SI,DI的情况,段寄存器为DS;
而对于寄存器为BP的情况,则段寄存器为SS.
MOVAX,[SI+3000H]
设(DS)=4000H,(SI)=2000H
则物理地址PA=40000H+2000H+3000H
45000H
AX
30
代码段
00
OP
=45000H
2.5基址变址寻址(Basedindexedaddressing)
●操作数的有效地址是一个基址寄存器和一个变址寄存器内容以及位移量X三者之和,两个寄存器均由指令指定。
[BR+IR+X]或X[BR+IR]X[BR][IR]
X为8位或16位二进制补码表示的有符号数
BR基址寄存器可以选用BX,BP,它们“决定”段
IR变址寄存器可以选用SI,DI
MOVAX,8[BX+SI]
MOVBX,-6[BP+DI]
综合举例:
指出下列指令中源操作数的寻址方式:
MOVAX,02FH
MOVBX,[SI]
MOVCX,[BX+SI+2]
MOVDX,DS:
MOVSI,BX
例2:
指出下列指令的错误:
MOVBX,[AX]
MOVBX,DS[SI]
MOV[CX],2
MOV[SI+DI],AX
MOVAX,[2000H]
第三章、宏汇编语言
1、了解常量、变量与标号在汇编语言中的属性和定义形式,应使学生熟练使用数值表达式和地址表达式。
2、掌握数据传送指令、算术逻辑运算指令的语句格式及功能。
3、了解伪指令和机器指令的区别,掌握数据定义伪指令和符号定义伪指令的格式及功能。
4、理解假定伪指令ASSUME的功能和使用方法,以及汇编地址计数器$的作用。
5、熟练掌握1号、2号、9号、10号系统功能调用的格式要求及功能。
1、数值表达式和地址表达式。
2、数据传送指令、算术逻辑运算指令。
3、伪指令。
4、DOS系统功能调用。
1、常量、变量与标号在汇编语言中的属性和定义形式,数值表达式和地址表达式的使用,要求达到“掌握”层次。
2、数据传送指令、算术逻辑运算指令的语句格式及功能。
要求达到“掌握”层次。
3、伪指令的语句格式及功能,要求达到“掌握”层次。
4、DOS系统功能调用的机理,要求达到“掌握”层次。
3.0一个简单的汇编语言源程序
两数求和程序如下:
DSEGSEGMENT‘DATA’
DATA1DB15H
SUMDB00H
DSEGENDS
CSEGSEGMENT‘CODE’
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAL,DATA1
ADDAL,12H
MOVSUM,AL
HLT
CSEGENDS
ENDSTART
观察程序的结构,猜测各语句的作用。
3.1汇编语言中的表达式
一、常量与数值表达式
1、常量:
在将汇编源程序翻译成目标程序期间已经有确定的数值的量。
●分类:
数值常量,符号常量
●数值常量的表示方法
二进制常量:
010101110B010101110b
八进制常量:
12537O45Q
十进制常量:
42981289D
十六进制常量:
0ABC2H
字符常量‘123ABC’“STUDY”
●标识符的格式
1标识符的第一个字符必须是字母、问号?
、@或下划线__四者之一;
2从第二个字符开始可以是字母、问号?
、@、下划线__或数字;
3一个标识符的长度可以有131个字符
下列标识符定义正确的是()
A)3DATAB)DATA_3C)DATA3D)DATA.3
●符号常量定义的方法
1EQU
AAEQU50
②=
BB=100
MOVAX,BB
则等价于MOVAX,100
2、数值表达式:
对常量的运算
●算术运算+-*/MODSHRSHL
CCEQU11111111B
表达式CCSHR3;
等价于00011111B
●逻辑运算ANDORXOR(按位加)NOT
789AHXOR000FH;
等价于7895H
●关系运算EQNELTGTLEGE
注意:
关系运算表达式的结果:
真0FFFFH
假0
NUM=50
NUMNE100;
等价于0FFFFH
MOVAX,NUMEQ100;
(AX)=0
二、变量、标号与地址表达式
1、变量:
数据存储单元的名字
●变量的段属性
●变量的偏移量属性
●变量的类型属性:
字节,字,双字,4字,10个字节
2、变量的定义
在数据段或附加段中用数据定义伪指令DB、DW、DD、DQ、DT
[变量名]数据定义伪指令表达式[,……]
x1DB08H
BUFDW01H,02H,03H,04H
●表达式的几种形式:
1数值表达式
2ASCII码字符串(只有用DB定义变量时,才允许字符串长度超过2个字符)
BUF1DB‘HELLO’;
等价于BUFDB‘H’,’E’,’L’,’L’,’O’
BUF2DB‘AB’
BUF3DW‘AB’
3地址表达式(只适用DW、DD两条伪指令)
BUF1DB‘HELLO’
SA_BUFDWBUF1
LA_BUFDDBUF1
④?
SUMDW?
⑤重复子句
格式为:
NDUP(表达式)
NDB3DUP(01H,02H)
MDB2DUP(2,2DUP(2,’2’))
综合举例1:
书P41图3。
综合举例2:
设有BUF1DB01H,02H,03H,04H
问执行MOVAL,BUF1后,AL中的内容?
要想将以上定义的03H取入AL,如何改上面指令?
3、在指令中如何使用变量
●直接寻址方式从变量中存取操作数时,定义该变量的段必须是当前段
●类型要匹配
MOVAX,BUF1这条指令就是错误的。
类型匹配的原则:
1单操作数指令,操作数类型必须明确;
2双操作数指令,两明确类型的操作数必须匹配;
3双操作数指令,一个类型明确,一个类型模糊时,以明确的那个操作数为准。
MOVAX,BL;
错误
MOV[SI],200;
INC[SI];
MOVAX,[SI];
MOVAL,[SI];
4、标号(出现在代码段中)
标号:
机器指令语句存放地址的符号表示,也可以是过程名。
XMOV:
MOVAL,[SI]
MOV[DI],AL
●标号的段属性
●标号的偏移量属性
●标号的类型属性:
NEAR(只能在标号定义的段内使用)
FAR
5、地址表达式
段内偏移地址
MOVAL,BUF1;
(