
微型计算机原理4 王忠民著.ppt
2021年2月8日 1,西安邮电学院计算机系 系统结构教研室 2009.8,微机原理与汇编语言,教材及参考书 微型计算机原理王忠民 王钰 王晓婕 编著 微型计算机原理学习与实验指导 王钰 王劲松 刑高峰 编著,2021年2月8日 2,第4章 80 x86指令系统,主要内容 80868088指令格式 80868088指令系统的寻址方式 80868088指令系统 80 x8Pentium指令系统,2021年2月8日 3,1.1 80868088指令系统 计算机是通过执行指令序列来完成用户的特定任务的,因此每种计算机都有一组指令集供用户使用。这组指令集就称为计算机的指令系统。 指令系统中的每一条指令都对应着微处理器要完成的一种规定的操作,这在设计微处理器时就事先规定好了,所以指令系统是表征一台计算机性能的重要因素,它的格式与规模将直接影响到机器的硬件结构。 指令系统是程序员编写程序的基础,因此很好地掌握指令系统的有关知识是后续进一步学习的关键。,2021年2月8日 4,4.1.1 8086/8088指令编码格式 通常在指令格式中包含操作码和操作数两大部分。 其中操作码表示计算机执行什么操作,操作数指明参与操作的对象,或规定操作对象的地址(即操作对象的存放位置)。 如何寻找操作数(即操作对象),这就是指令的寻址方式,它是由指令编码格式指出的。,2021年2月8日 5,80868088指令系统采用变字长的指令编码格式,其指令可由16个字节组成,它包括操作码(第一字节),寻址方式(第二字节),位移量、立即数(第三到第六字节)三部分组成。其中,寻址方式、位移量、立即数为操作数部分。,2021年2月8日 6,opcode,opcode,Mod字节,opcode,Mod字节,opcode,Mod字节,opcode,Mod字节,opcode,Mod字节,Data/disp,disp低,Data/disp低,Data/disp高,disp高,disp低,disp高,Data,Data低,Data高,操作码部分,操作数部分,一字节指令,二字节指令,三字节指令,四字节指令,五字节指令,2021年2月8日 7,双操作数指令中各字段定义2021年2月8日 8,例4.1 写出下面指令的机器语言编码。 MOV BXDI6,CL,指令码为 88H、49H、FAH,OPCODE D W,mod,r/m,reg,disp8,100010,01,001,0010,011111010,例4.2 写出下面指令的机器语言编码。 ADD AX,BXDI0826,03H 81H 26H 08H2021年2月8日 9,4.1.2 8086/8088指令系统的寻址方式 所谓寻址方式就是寻找操作数存放地址(位置)的方法。在8086/8088系统中操作数存放的位置有以下4种 操作数包含在指令字节中。即指令格式中操作数部分就是操作数本身。这种操作数叫立即数操作数。 操作数存放在CPU的某个内部寄存器中。这种操作数叫寄存器操作数。 操作数在内存的数据区中。这种操作数叫存储器操作数。,2021年2月8日 10, 操作数来自或送到I/O端口。这种操作数叫I/O操作数。 在8086/8088系统中,操作数又可分为两大类数据操作数和地址操作数。因此,寻址方式也分为数据寻址方式和地址寻址方式两大类。 1. 数据的寻址方式 对于数据操作数,有四种形式 无操作数 单操作数可以是源操作数,也可以是目的操作数。,2021年2月8日 11, 双操作数一个是源操作数,一个是目的操作数。 隐含操作数可能隐含一个操作数(源或目的),也可能隐含两个操作数。 源操作数在操作过程中其值不变的操作数。(可以提供数据的操作数) 目的操作数在操作后可被操作结果代替的操作数。(可以接收数据的操作数) 1)立即数寻址方式 例如MOV AL, 80H MOV AX, 1234H,2021年2月8日 12MOV AL, 80H,MOV AX, 1234H,2021年2月8日 13,2)寄存器寻址方式 例如INC CX MOV AX, CX,89,C1,程序存储器,AX,CX指令码 (包括操作数),2021年2月8日 14,3)存储器寻址方式 存储器寻址方式的操作数存放在存储器单元中。因此,要存取操作数就必须知道其存储器的单元地址。在指令中可以直接给出或间接给出操作数的地址,以达到存取操作数的目的。 指令中给出的地址只是操作数的有效地址(EA),并且是放在方括号(“ ”)中。若要从存储器中存取操作数还须得到实际的地址(物理地址)。 物理地址段地址左移四位有效地址,物理地址,CS DS SS ES, 10H, EA,2021年2月8日 15,有效地址可以由以下三种地址分量组成 位移量它是存放在指令中的一个8位或16位的带符号数。 基 址它是存放在基址寄存器BX或BP中的内容。 变 址它是存放在变址寄存器SI或DI中的内容。 对于某条具体指令,这三个地址分量可有不同的组合。正是因为这三种地址分量有不同的组合,才使得对存储器操作数的寻址产生了若干种不同的方式。,2021年2月8日 16, 直接寻址方式 MOV AL, 1064H 1064HEA 16位 disp,2021年2月8日 17, 寄存器间接寻址 MOV AX, SI MOV BX, AL,SI 2000H,BX 1000H,MOV AX, SI,MOV BX, AL,2021年2月8日 18, 寄存器相对寻址,MOV CL, BX1064H,2021年2月8日 19, 基址加变址寻址方式 MOV AH, BPSI,BP 2000H,SI 1200H,2021年2月8日 20, 基址加变址相对寻址 MOV BXDI1234H, AH,BX 0200H,DI 0010H,2021年2月8日 21,4)I/O端口寻址方式 直接端口寻址方式 IN AL, 21H2021年2月8日 22, 间接端口寻址方式 OUT DX, AL,2021年2月8日 23,2.地址的寻址方式 地址的寻址方式其时是程序转移地址的寻址方式,也就是找出程序转移的地址号,而不是操作数。 转移地址可以在段内(称段内转移),也可以跨段(称段间转移)。寻求转移地址的方法有以下四种 1)段内直接寻址 转移的地址是当前IP内容和指令规定的8位或16位位移量之和。 当位移量是8位时,称为短程转移;位移量是16位时称为近程转移。,2021年2月8日 24,这种寻址方式适用于条件转移或无条件转移类指令。但条件转移只有8位位移量的短程转移。当前IP,有效转移地址,opcode,位移量,PM,CS 10H EA位移量,2021年2月8日 25,例JMP SHORT ALPHA 本例指令是一无条件转移指令,指令采用了段内直接寻址方式。符号地址ALPHA代表位移量。设ALPHA20H,开始执行该指令时,CS1500H,IP3200H,于是该指令在存储器中的起始地址为 15000H3200H18200HOP,20H,存储器,15000H,18200H,18201H,18202H,18222H,20H,当前代码段首地址,JMP SHORT ALPHA,转移地址,而转移有效地址为 EA当前IPALPHA3202H20H3222H 转移物理地址为 PA15000H3222H18222H 执行完这条指令后,IP的内容变成3222H不再是3202H,CPU将转移到存储单元地址18222H中去取指令来执行。,2021年2月8日 26,2)段内间接寻址方式 程序转移的地址存放在寄存器或存储器单元中。指令执行使用寄存器或存储器单元的内容来更新IP的内容。,例如 JMP BX JMP WORD PTR ADDR JMP WORD PTR BXARRY,2021年2月8日 27,例JMP WORD PTR BETA 本指令是无条件转移指令,可使程序转移到根据BETA指示的内存单元中取出的偏移地址开始执行指令。指令采用的是段内间接寻址方式。指令的操作数地址是一个符号地址BETA,所以可用数据寻址方式中的直接寻址方式得到存储转移偏移地址的内存单元地址。设当前CS0120H,IP2400H,BETA0100H,DS2000H,20100H00H,20101H27H,则存储转移偏移地址的内存单元地址为 DS左移4位BETA20000H0100H 20100H 又20100H00H,20101H27H,即转移物理地址为 PA01200H2700H03900H 执行完这条指令后,IP的内容变成2700H,CPU将转移到存储单元03900H去执行程序。OP,OP,00H存储器01200,03600,03601,03602,03900,当前代码段首址,JMP WORD PTR BETA,转移地址00H,27H,01H,20000,20100,20101,数据区首地址,036032700HIP2021年2月8日 28,3)段间直接寻址方式 这种寻址方式是指令码中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP内容。,2021年2月8日 29,例JMP FAR PTR GAMMA 本例指令为无条件转移指令,采用段间直接寻址方式。设当前CS2000H IP1000H GAMMA30004000 则本指令的起始地址为 20000H1000H21000H 转移物理地址为 PA30000H4000H34000H 执行完这条指令后,CS的内容变成3000H,IP的内容变成4000H,从而程序转移到存储单元34000H开始执行。,2021年2月8日 30,4)段间间接寻址方式 这种寻址方式是由指令码的寻址方式字节求出存放转移地址的连续两个字的地址。其低位字地址单元中存放的是偏移地址,高位字地址单元中存放的是转移段地址。,2021年2月8日 31,例JMP DWORD PTR DELTABX 本例指令是无条件转移指令,采用段间间接寻址方式。 设当前CS1000H,IP0100H,DS2000H,BX3000H,DELTA0040H,23040H00H,23041H50H,23042H00H,23043H30H,则间接存储地址按寄存器相对寻址为 DS左移4位BXDELTA20000H3000H0040H 23040H 于是,可得转移地址为 3000H5000H 即转移物理地址为 PA30000H5000H35000H 执行本指令后,CS的内容和IP的内容分别变成3000H和5000H,程序转移到存储单元35000H开始执行。,2021年2月8日 32,指令执行前 CS1000H IP0100H DS2000H BX3000H DELTA0040H 指令执行后 CS3000H IP5000H,2021年2月8日 33,段间间接寻址方式,段间直接寻址方式段间直接和间接寻址的区别,2021年2月8日 34,4.1.3 8086/8088指令系统 8086/8088指令系统大致可分为六大类指令 数据传送类指令 算术运算类指令 位操作类指令 串操作类指令 程序控制类指令 处理器控制类指令 学习指令系统着重要掌握指令的基本操作功能、合法的寻址方式及其对状态标志位的影响。,2021年2月8日 35,1. 数据传送类指令 数据传送指令的主要功能是传送数据、地址和标志。可分为通用数据传送指令、输入输出指令、地址传送指令和标志传送指令。 1)通用数据传送指令 通用数据传送指令可完成字节或字数据的传送。它可分为数据传送指令、堆栈操作指令、数据交换指令和字节转换指令。 1 数据传送指令 指令格式MOV dst,src ;dstsrc,src表示源操作数字/字节 立即数操作数 寄存器操作数(包括段寄存器) 存储器操作数,dst表示目的操作数字/字节 寄存器操作数不包括IP,CS段寄存器 存储器操作数,2021年2月8日 36段寄存器 CS DS SS ES,存储器,通用存储器 AX BX CX DX BP SP SI DI AL BL CL DL AH BH CH DH,MOV指令数据传送方向,16位,8/16位,8/16位,16位,8/16位,指令功能将源操作数传送(复制)到目的操作数。 传送方向如下图所示。,立即数2021年2月8日 37,2 堆栈操作指令 堆栈操作指令是用来完成压入和弹出堆栈操作的。80868088指令系统中提供了完成这两种操作的相应指令。 压入堆栈指令 指令格式及操作 PUSH src ;SPSP-2, ;SP1SPsrc,src表示源操作数字 寄存器操作数(包括段寄存器) 存储器操作数,2021年2月8日 38,注意堆栈指令的操作数只能是字操作数(即16位操作数),且不能是立即数。 进栈操作(PUSH)先移后进 出栈操作( POP)先出后移, 弹出堆栈指令 指令格式及操作 POP dst ;dstSP1SP, ;SPSP2,dst表示目的操作数字 寄存器操作数不包括IP,CS段寄存器 存储器操作数,2021年2月8日 39,3)交换指令 指令格式及操作 XCHG opr1,opr2 ;opr1opr2 注意交换指令的两个操作数可以是寄存器操作数,存储器操作数,但都不能是立即数操作数,也不能同时为存储器操作数;寄存器操作数是指通用寄存器,不包括段寄存器。 也就是说,交换指令是完成寄存器与寄存器、寄存器与存储器之间的数据互换功能。交换的两个数据可以是8位的,也可以是16位的。,2021年2月8日 40,4)字节转换指令 指令格式及操作 XLAT src_table ;AL BXAL XLAT指令是用来将一种字节代码转换成另一种字节代码。即将BX的内容(代码表格首址src_table)和AL的内容(表格偏移量)相加作为有效地址。并从中读出此内存表格地址单元的内容传送到AL累加器中。 XLAT指令还可以有以下几种表示形式 XLAT ;不写操作数 XLATB ;有B就不允许再写操作数。 XLAT ESsrc_table ;重设段寄存器为ES,2021年2月8日 41,例在内存的数据段有一张16进制数的ASCII码表,其首地址为Hex_table,如下图所示,为欲将十六进制数0AH转换成ASCII码,则可用以下几条指令实现 MOV BX, OFFSET Hex_tale;BX 表首址 MOV AL, 0AH ;AL 十六进制数A XLAT Hex_table;查表转换,BX 1000H,AX 000AHHex_table,2021年2月8日 42,2 输入/输出指令 输入输出指令可以分为两大类一类是直接端口地址的输入输出指令;一类是通过DX寄存器间接端口地址的输入输出指令。 1 输入指令 直接寻址的输入指令 指令格式及操作 IN acc, port ;accport 其中acc为8位或16位累加器AL/AX。port为8位端口地址,故可寻址256个端口。,2021年2月8日 43, 间接寻址的输入指令 指令格式及操作 IN acc, DX ;accDX 其中acc为8位或16位累加器AL/AX。DX为16位间接寻址的端口地址寄存器,故可寻址64K个端口。 2 输出指令 直接寻址的输出指令 指令格式及操作 OUT port, acc ;portacc,2021年2月8日 44, 间接寻址的输出指令 指令格式及操作 OUT DX, acc ;DXacc,2021年2月8日 45,3 地址传送指令 1)取有效地址指令 指令格式 LEA reg16, mem 此指令的功能是将存放源操作数的16位偏移地址即有效地址EA送到一个16位的通用寄存器中。即源操作数必须是一个存储器操作数,目的操作数必须是一个寄存器操作数。例如 LEA BX, buffer LEA AX, BPDI LEA DX, betyBXSI,2021年2月8日 46,注意LEA指令和MOV指令的异同,比较下面两组指令 不同LEA BX,buffer ;将存储器buffer的偏 移地址送到BX MOV BX,buffer ;将存储器buffer的内 容传送到BX 相同LEA BX,buffer MOV BX,OFFSET buffer 以上两条指令都是将存储器buffer的偏移地址送到BX。其中OFFSET buffer 表示存储器偏移地址。,2021年2月8日 47,2)地址指针装入DS指令 指令格式 LDS reg16,mem32 此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入DS,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如 LDS DI,2130H,2021年2月8日 48,3)地址指针装入ES指令 指令格式 LES reg16,mem32 此指令的功能是将源操作数所对应的双字长的内存单元中的高字内容(一般为16位段基址)送入ES,低字内容(一般为偏移地址)送入指令所指定的寄存器中。例如 LES DI,2130H,2021年2月8日 49,4 标志传送指令 1)取标志指令 指令格式 LAHF 2)置标志指令 指令格式 SAHF,OF,DF,IF,TF,SF,ZFAFPFCF,FLAG,AH,LAHF和SAHF指令操作示意图,2021年2月8日 50,3)标志压入堆栈指令 指令格式及操作 PUSHF ;SPSP-2, SP1;SPFLAG 4)标志弹出堆栈指令 指令格式及操作 POPF ;FLAGSP1;SP, SPSP2,2021年2月8日 51,在使用这些传送类指令时应注意以下几点 目的操作数不能为立即数。 目的操作数为段寄存器CS不能作为目的操作数,源操作数不能为立即数。 源操作数为非立即数时,两操作数之一必须为寄存器操作数。 操作数类型必须一致。 用BX、SI、DI来间接寻址时,默认的段寄存器为DS;用BP来间接寻址时,默认的段寄存器为SS。,2021年2月8日 52, 对于堆栈操作,源操作数不能为立即数;CS寄存器的值可以压入堆栈,但反之则不允许。 数据交换指令的两个操作数任一都不能是立即数。 换码指令的操作数是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。 除了SAHF和POPF指令外,其余指令都不会影响标志。,2021年2月8日 53,2、算术运算类指令,80868088有丰富的算术运算指令,而且可以处理4种类型的数据,如下表所示,2021年2月8日 54,1 加法指令,在微处理器中,没有专用的BCD码运算指令,使用二进制运算指令进行BCD码数的运算,然后用BCD码运算调整指令进行调整,重新得到BCD码的结果。,2021年2月8日 55,AAA指令的操作为非压缩型BCD码调整) 如果AL0FH9 或 AF1 则ALAL06H AHAH1 AF1 CFAF ALAL0FH 否则ALAL0FH DAA指令的操作为 压缩型BCD码调整) 如果AL0FH9, AF1 则ALAL06H AF1 如果AL9FH 或 CF1 则ALAL60H CF1,2021年2月8日 56,例要求计算两个十进制数之和,78。可用以下指令实现 非压缩型BCD码调整 MOV AX, 0007H;AL07H,AH00H MOV BL, 08H;BL08H ADD AL, BL;AL0FH AAA;AL05H,AH01H ;CFAF1 压缩型BCD码调整 MOV AX, 0007H;AL07H,AH00H MOV BL, 08H;BL08H ADD AL, BL;AL0FH DAA;AL15H,AH00H;CF0,AF1,2021年2月8日 57,例要求计算两个十进制数之和,5634。可用以下指令实现压缩型BCD码调整 MOV AX, 3456H;AL56H,AH34H ADD AL, AH ;AL8AH DAA ;AL90H 例要求计算两个BCD数的ASCII码之和,即 59。可用以下指令实现ASCII码调整 MOV AL, 5 ;AL35H ADD AL, 9 ;39H,AL6EH MOV AH, 0 ;AH00H AAA;AH01H,AL04H OR AX,3030H;AX3134H,即34,2021年2月8日 58,2 减法指令,2021年2月8日 59,AAS指令的操作为 非压缩型BCD码调整 如果 AL0FH9 或 AF1 则ALAL06H AHAH1 AF1 CFAF ALAL 0FH 否则ALAL 0FH DAS指令的操作为 压缩型BCD码调整 如果AL0FH9, AF1 则ALAL06H AF1 如果AL9FH 或 CF1 则ALAL60H CF 1,2021年2月8日 60,例要求计算两个十进制数之差,86-7。可用以下指令实现 非压缩型BCD码 MOV AX, 0806H;AH08H,AL06H SUB AL, 07H;AX08FFH AAS ;AX0709H 例要求计算两个十进制数之差,134-56。可用以下指令实现 压缩型BCD码 MOV AX, 5634H;AH56H,AL34H SUB AL, AH;ALDEH,有借位 DAS ;AL78H,2021年2月8日 61,3 乘法指令,AL,源操作数,AL,AH,AX,源操作数,AX,DX,2021年2月8日 62,AAM指令的操作为将二进制数转换成十进制数 AHAL/0AH的商;即AL除以10,商送AH ALAL/0AH的余;即AL除以10,余数送AL 例要求进行以下十进制乘法运算79 解可编程序段如下 MOV AL,07H ;AL07H MOV BL,09H ;BL09H MUL BL ;AX07H09H003FH AAM ;AH06H,AL03H,2021年2月8日 63,4除法指令,2021年2月8日 64,8086/8088CPU执行除法时规定除数只能是被出数的一半字长。当被除数为16位时,除数应为8位;当被除数为32位时,除数应为16位。,AL,源操作数,AX,AH,AX,AX,源操作数,DX,DX,商,商,余数,余数,8位,16位,16位,32位,除数,除数,被除数,被除数,2021年2月8日 65,AAD指令的操作为十进制数转换成二进制数 ALAH0AHAL AH0 例要进行以下十进制除法运算732 解可编程序段如下 MOV AH,07H ;AH07H MOV AL,03H ;AL03H MOV BL,02H ;BL02H AAD ;AL49H即十进制数73 DIV BL ;AL24H商,AH01H余数 AAM ;AH03H,AL06H,2021年2月8日 663.位操作类指令 位操作指令是对8位或16位的寄存器或存储单元中的内容按位进行操作。这一类指令包括逻辑运算指令、移位指令和循环移位指令等三组。 1 逻辑运算指令 逻辑运算类指令与算术运算指令不同,算术指令是按字节或字进行算术运算,而逻辑运算指令是把操作数按位来进行逻辑运算。,2021年2月8日 67说明TEST相当于AND运算,但是不保存结果,仅影响标志。,2021年2月8日 68,常见的用法举例 清进位标志位AND AX,AX 或 OR AL,AL等。 清零操作数XOR AX,AX 不仅把AX清零,而且也影响了状态标志。 把某几位取反用XOR指令,把要取反的位和1异或,不变的位和0异或。 清零或置位某几位用AND指令清零,用OR指令置位。,2021年2月8日 69,2 移位操作指令 该类指令的使用方法是 移动1位,用类似于 SHL AX,1的格式 移动n位,用类似于 SHL AX,CL的格式CFdstCF0,dstCF0,dstCF0,dst,2021年2月8日 70,说明 逻辑移位适用于无符号数,算术移位适用于有符号数。 逻辑左移和算术左移的机器码完全相同,是助记符的两种写法。,2021年2月8日 71,说明 循环移位常用来变换数据格式。CFdst,CFdst,CFdstCFdst,2021年2月8日 72,使用举例 例一 利用循环移位指令可以对寄存器或存储器中的任一位进行测试。如要测试AL寄存器中的第5位的状态是“0”还是“1”,则可利用以下 指令实现 MOV CL,5;CL移位次数 ROR AL,CL;CFAL的第5位 JNC ZERO;若CF0,转ZARO ;否则 ZERO ,2021年2月8日 73,例二 利用带进位循环移位指令可以实现将两个以上寄存器或存储器单元组合起来一起移位。如DX和AX两个寄存器组成的32位数乘以2,可用以下两条指令实现 SHL AX,1 ;AX左移1位,CFAX的最高位 RCL DX,1 ;DX带进位左移1位,DX的最低位CF 具体操作如下图,CF,DX,AX,0, RCL DX,1, SHL AX,1,2021年2月8日 744.串操作指令 串操作指令的特征是对数据块,也称数据串 (字符串或数值串)进行操作。其操作数为隐含操作数,并且其中部分指令的两个操作数可以同时是存储器操作数。 串传送 MOVS Move string 串比较 CMPS Compare string 串扫描 SCAS Scan string 串装入 LODS Load from string 串保存 STOS Store in to string,2021年2月8日 75,说明 串操作指令每次执行完成一个字节或一个字的操作。 通常使用重复前缀来自动完成一个数据块(数据串)的操作。 重复前缀 REP 重复 REPE/REPZ 相等/为零则重复 REPNE/REPNZ不相等/不为零则重复,2021年2月8日 76,特点 串操作指令需要指明每次操作的数据串数据的类型B表示字节串,W表示字串。 例如MOVSB, CMPSW等。 串操作指令使用DSSI作为源操作数的指针;ESDI作为目的操作数的指针 使用DF来表示每次操作以后变址寄存器SI和DI的变化方向 CLD ;DF0 SI,DI做增量变化 B1或W2 STD ;DF1 SI,DI做减量变化 B-1或W-2 使用CX来表示用重复前缀以后指令需要重复执行的次数(通常是数据串的长度),2021年2月8日 77,2021年2月8日 78,2021年2月8日 795.控制转移类指令 能够使程序的执行流程发生改