1、1,第三章 Pentium的指令系统,2,本章基本内容,(1)8086的指令指令与指令系统汇编语言的寻址方式8086的指令及其用法数据传送指令算术运算指令逻辑运算指令与移位指令串操作指令程序控制指令 (2)Pentium指令与8086指令的兼容性,区别新扩展的指令简介,3,学习要求,指令系统是程序员编写程序的基础,因此很好地掌握本章内容是后续进一步学习汇编语言程序设计的关键。通过本章学习,应该达到如下要求: 1、了解80x86指令格式。 2、熟练掌握80x86的寻址方式。 3、掌握80x86指令系统中的各种指令的名称、功能及对操作数寻址方式的约定。,4,指令,指挥计算机执行某种操作的命令。 指
2、令在计算机内部是一组二进制编码。通常,它需要告诉计算机要执行什么操作,如果需要数据,还应指出数据的来源、操作结果的去向。一般来说指令是由操作码、寻址方式、操作数组成。,5,(1) 操作码:表示指令操作类型;例如做加法,从内存中读取数据,或将数据输出到输出端口等。 (2) 操作数:给出指令所需操作数或操作数的地址;在指令中操作码是不可缺少的,但操作数可以没有,也可以有一个操作数或两个操作数。,指令的基本格式:,6,根据操作数的个数,指令格式可分为以下几种: 零操作数指令指令格式中没有操作数。 一操作数指令指令格式中有一个操作数。 二操作数指令指令中有两个操作数,其中一个为目的操作数,另一个为源操
3、作数。,7,由此可见,操作数可分为源操作数和目的操作数。源操作数:需要处理的数据,它是要读取的操作数。 目的操作数:它是对源操作数处理的结果,写入(存放操作结果)的操作数。在许多情况下,有一个特殊的寄存器,它既是源操作数,又保存结果(目的操作数)累加器AX。操作数又可分为两大类:数据操作数和地址操作数。,8,1.数据操作数 这类操作数是与数据有关的操作数,即指令中要操作的对象是数据。数据操作数又可分为立即数操作数、寄存器操作数、存储器操作数和I/O操作数。,寄存器操作数:指令中要操作的数据存放在指 定的寄存器中。,存储器操作数:指令中要操作的数据存放在指定的存储器中。,I/O操作数:指令中要操
4、作的数据来自或送到I/O端口。,立即数操作数:指令中要操作的数据在指令中,9,2. 地址操作数 这类操作数是与程序转移地址有关的操作数,即指令中要操作的对象不是数据,而是要转移的目的地址。 地址操作数也可分为立即数操作数、寄存器操作数和存储器操作数,即要转移的目的地址包含在指令中,或存放在寄存器中,或存放在存储器单元之中。,10,指令在计算机内部用二进制代码表示。 由二进制表示的指令机器指令。 机器指令是计算机唯一能直接执行的指令。,11,一条指令中的信息按其含义分成若干个信息段,每一信息段占一个字节或多个字节,且按一定的顺序排列,这便于CPU解释执行。如80868088CPU的指令系统,它采
5、用16个指令字节的变字长指令格式:,12,指令系统,一台计算机全部指令的集合 不同的CPU具有各自不同的指令系统,13,指令执行时间,总时间=基本执行时间 + 计算有效地址的时间 + 读取内存的时间字操作数在内存的存放格式也是影响一条指令执行时间的因素。,14,8086数据总线的传输特性 : 读写偶地址字读写偶地址字节读写奇地址字节读写奇地址字 当16位操作数存放在偶数地址时,存取时间=1个机器周期,否则需要2个机器周期,对于16位数据,操作数存放地址对指令执行会产生影响。,15,3.1 8086的寻址方式,汇编语言指令要解决的两个问题:要指出进行什么操作操作符;要指出操作数和操作结果放在何处
6、寻址方式。,16,在8086/8088系统中,操作数可分为两大类:数据操作数和地址操作数。因此,寻址方式也分为两大类: 数据寻址方式:找出操作数的存放地址; 地址寻址方式:找出下一条要执行的指令的地址。一 数据寻址方式按照操作数的来源:指令中、寄存器中、存储器中、I/O端口,又分为: 立即数寻址 寄存器寻址 输入/输出端口寻址 存储器寻址存储器寻址有若干种不同的方法。,17,3.1.1 立即数寻址 操作数直接包含在指令中。立即数有8位和16位。 例 : MOV AL , 80H ;源操作数为立即寻址方式;指令执行后,(AL)=80H 例 : MOV AX ,1234H ;源操作数为立即寻址;指
7、令执行后,(AX)=1234H立即数寻址,主要是对寄存器赋值,操作数是常数,且只能用于源操作数字段,立即数的类型必须与目的操作数的类型一致,18,3.1.2 寄存器寻址,操作数存放在CPU内部寄存器寄存器寻址方式。 比如: MOV AX,BX ;将BX中的内容传送到AX中去 INC CX ;将CX的内容加1 ROL AH,1 ;将AH中的内容循环左移一位 MOV AX,3064H ;目的操作数是寄存器寻址 16位寄存器为:AX,BX,CX,DX,SI,DI,SP,BP 8位寄存器为:AH,AL,BH,BL,CH,CL,DH,DL 段寄存器:DS,SS,ES 源操作数、目的操作数都可以使用寄存器
8、寻址方式 源操作数还可以使用段寄存器CS,19,3.1.3 I/O端口寻址,与外设之间的数据传送。 1. I/O端口直接寻址指令中直接给出I/O端口地址。例: IN AL, 21H ;OUT 80H, AX ; 注意:端口编号不大于0FFH 2. I/O端口间接寻址端口地址在寄存器DX中。 例: IN AL,DXOUT DX, AX,端口只能与AX,AL寄存器传送 直接寻址空间0255,端口只能与AX,AL寄存器传送 地址寄存器只能使用DX,寻址空间065535,20,直接端口寻址方式IN AL, 21H,21,间接端口寻址方式OUT DX, AL,22,3.1.4 存储器寻址方式 存储器寻址
9、方式的操作数存放在存储器单元中。因此,要存取操作数就必须知道其存储器的单元地址。在指令中可以直接给出或间接给出操作数的地址,以达到存取操作数的目的。 指令中给出的地址只是操作数的有效地址(EA),并且是放在方括号(“ ”)中。若要从存储器中存取操作数还须得到实际的地址(物理地址)。物理地址段基址左移四位有效地址,23,有效地址可以由以下三种地址分量组成: 位移量(Displacement):它是存放在指令中的一个8位或16位的数,但它不是立即数,而是一个地址。 基址(Base Address):它是存放在基址寄存器BX或BP中的内容。 变址(Index Addess):它是存放在变址寄存器SI
10、或DI中的内容。对于某条具体指令,这三个地址分量可有不同的组合。如果存在两个或两个以上的分量,那么就需要进行加法运算,求出操作数的有效地址(EA),进而求出物理地址(PA)。正是因为这三种地址分量有不同的组合,才使得对存储器操作数的寻址产生了若干种不同的方式。,24,EA的表达式,EA=(基址寄存器)+(变址寄存器)+偏移量基址寄存器:BX,BP变址寄存器:SI,DI偏移量:0、8、16位数值三部分可组合成5种寻址方式直接寻址: EA=偏移量寄存器间接寻址: EA=(基址寄存器)或(变址寄存器)寄存器相对寻址: EA=(基址寄存器)或(变址寄存器) +偏移量 基址+变址寻址: EA=(基址寄存
11、器)+(变址寄存器)相对基址+变址寻址: EA=(基址寄存器)+(变址寄存器)+偏移量,25,注意:对于双操作数指令,两个操作数不允许同时用存储器寻址方式,即不允许两个操作数都是存储单元,26,1. 直接寻址,指令中直接给出存储器的地址,地址用方括号括起来 MOV AL, 1064H,设当前(DS)=2000H,27,例: MOV AX, 1234H MOV 2345H,BL 如果(DS)=1000H,则从 11234H和11235H取数送AX默认段:DS 物理地址=(DS) 10H + EA可以强制使用其他段使用段超越前缀 例: MOV AX, ES:1000H 物理地址=(ES) 10H
12、+ EA,28,如果没有特殊指明,直接寻址方式的操作数一般在存储器的数据段中,即隐含的段寄存器是DS。但是8086/8088也允许段超越,此时需要在指令中特别标明,方法是在有关操作数的前面写上操作数所在段的段寄存器名,再加上冒号。例如,若以上指令中源操作数不在数据段而在附加数据段中,则指令应写为如下形式:MOV AL,ES:1064H在汇编语言指令中,可以用符号地址来表示位移量。例如:MOV AL,value 或 MOV AL,value 此时value为存储单元的符号地址。,29,2. 寄存器间接寻址,存储器的地址存放在寄存器中。 注意与前面的寄存器寻址的区别! 例:MOV AX,BX ;
13、BX的内容是操作数的有效地址。 注: 可以使用的寄存器:BX、BP、SI、DI 若是用BX、SI、DI,段寄存器默认DS,默认的是数据段 若是用BP,段寄存器默认SS,则默认的是寻址堆栈段 可以用段超越前缀强制使用某个制定的段。 例如 MOV BP,AX ;使用堆栈段,物理地址; PA=(SS)*10H+(BP) 注:PA表示物理地址,EA表示有效地址(段内偏移地量),30,设当前(DS)=3000H, (SI)=2000H, (BX)=1000HMOV AX, SI,(SI)= 2000H,BX 1000H,MOV BX, AL,31,3. 寄存器相对寻址,指令形式: MOV AX,1000
14、HBX ;EA=(BX)+1000H;PA=(DS)*16+EA 上述指令也可以写成:MOV AX,BX+1000H 或 MOV AX,BX+1000H 三种格式是相同的。也可用符号地址。 有效地址是指令指定的寄存器的内容与一个偏移量之和。 可以认为它是直接寻址和寄存器间接寻址的结合。,32,可使用的变址寄存器: SI,DI,BX,BP 使用 SI,DI,BX时,默认的段寄存器为DS,PA=(DS)*10H+EA例如 MOV AX,SI+1200H 假设(DS)=2000H,(SI)=1500H假设地址为22700H的存储单元的内容:34H,12H则PA=2000H*10H+1500H+120
15、0H=22700H,从22700H存储单元取16位数据送到AX寄存器。 指令执行完毕, (AX)=1234H,33,使用BP时,这时默认的段寄存器为SSPA=(SS)*10H+EA 例如 MOV 2100HBP,AX 假设(SS)=3000H,(BP)=2000H,(AX)=1234H PA=3000H*10H+2100H+2000H=34100H执行该指令,是将AX的内容送到34100H存储单元保存。,允许段超越利用段超越前缀制定段寄存器,34,MOV CL, BX+1064H,35,4. 基址+变址寻址,通常BX、BP叫做基址寄存器。SI、DI叫做变址寄存器 将它们结合起来,就构成基址+变
16、址寻址。例: MOV AX,BX+SI 或 MOV AX,BXSIEA=DS: (BX)+(SI)MOV BX+DI,AXEA=DS: (BX)+(DI) 注:当使用BX做基址寄存器时,默认段为数据段,段基地址DS;当使用BP做基址寄存器时,默认段为堆栈段,段基地址SS;允许使用段超越前缀改变默认的段寄存器。,36,MOV AH, BPSI,37,5. 基址加变址相对寻址,在前述基址加变址寻址的基础上,增加一个常数偏移量。例: MOV AX,1000HBX+DI 或 MOV AX,1000HBXDI (DS)*10H+(BX)+(DI)+1000H 存储单元16位内容送寄存器AX。默认的段寄存
17、器同上,允许段超越。,38,MOV BX+DI+1234H, AH,39,当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。 段超越前缀形式为:段寄存器名:地址 例如:MOV AX,ES:BP ;段地址在ES MOV AX,CS:BX SI ;段地址在CS 段地址的基本约定和允许超越的情况如表所示:,6. 段超越,40,41,存储器寻址方式小结,42,存储器寻址方式举例,例:设当前有关寄存器的内容为:(BX)=6000H, (BP)=4000H, (SI)=2000H, (DS)=3000H
18、, (ES)=3500H, (SS)=5000H, 试确定下列指令中存储器方式的 操作数在内存中的逻辑地址和物理地址。,43,二 地址的寻址方式 地址的寻址方式其实是程序转移地址的寻址方式,也就是找出程序转移的地址号,而不是操作数。 转移地址可以在段内,也可以跨段转移(称段间转移)。寻求转移地址的方法有以下四种: 1.段内直接寻址 转移的地址是当前IP内容和指令规定的8位或16位位移量之和。 当位移量是8位时,称为短程转移;位移量是16位时称为近程转移。,44,这种寻址方式适用于条件转移或无条件转移类指令。但条件转移只有8位位移量的短程转移。,+,IP,EA,有效转移地址,位移量,存储器,(CS) 10H + EA,位移量,45,2.段内间接寻址方式 程序转移的地址存放在寄存器或存储器单元中。指令执行使用寄存器或存储器单元的内容来更新IP的内容。,46,3.段间直接寻址方式 这种寻址方式是指令码中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP内容。,47,4.段间间接寻址方式 这种寻址方式是由指令码的寻址方式字节求出存放转移地址的连续两个字的地址。其低位字地址单元中存放的是偏移地址,高位字地址单元中存放的是转移段基址。,