第2章指令系统及汇编程序设计word03.ppt_第1页
第2章指令系统及汇编程序设计word03.ppt_第2页
第2章指令系统及汇编程序设计word03.ppt_第3页
第2章指令系统及汇编程序设计word03.ppt_第4页
第2章指令系统及汇编程序设计word03.ppt_第5页
已阅读5页,还剩432页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2020年6月9日星期二,1,微机原理与接口技术,2020年6月9日星期二,2,指令系统及汇编语言程序设计,1概述一、指令系统人们要求计算机解决计算或处理信息的问题,首先必须把问题要转换为计算机能识别和执行的一步步操作步骤,我们把这种要求计算机执行的各种操作用命令形式写下来,这就称为指令。,2020年6月9日星期二,3,指令系统及汇编语言程序设计,通常一条指令对应一种基本操作,例如加、减、传送、移位等,一个计算机能执行什么样操作,能做多少种操作,是由该计算机的指令系统所决定的,因此,计算机所能执行的全部指令,就是计算机的指令系统。微处理器的主要功能是由它的指令系统来体现的。,2020年6月9日星期二,4,指令系统及汇编语言程序设计,目前,一般小型或微型计算机的指令系统可以包括几十种或百余种指令(8086有115条)。每种计算机都有自己固定的指令系统,8086/8088的指令系统和M68000的指令系统具有不同的指令,不能相互兼容,,2020年6月9日星期二,5,指令系统及汇编语言程序设计,也就是说,8086/8088的指令系统中的指令,只能由8086/8088微处理器所识别和执行,而不能被M68000微处理器所识别和执行。但8086/8088微处理器可以执行8080/8085指令系统中的指令,所以只有同系列微处理器指令系统是相兼容的。,2020年6月9日星期二,6,指令系统及汇编语言程序设计,二、指令格式计算机中的指令有操作码字段和操作数字段两部分组成。操作码字段指出计算机所要执行的操作,而操作数字段则指出在指令操作过程中所需的操作数据。例如,加法指令一方面需要指定做加法操作的部分,即操作码字段。,2020年6月9日星期二,7,指令系统及汇编语言程序设计,另一方面需给出被加数和加数部分,即操作数字段。操作数字段可以是操作数本身,也可以是操作数地址或地址的一部分,还可以是指向操作数地址的指针或其他有关操作数的信息。,2020年6月9日星期二,8,指令系统及汇编语言程序设计,指令的格式一般是:,操作码操作数操作数,操作数字段可以有一个、二个或三个,通常称为一地址、二地址或三地址指令。例如,单操作数指令,它只需指定一个操作数参加操作,如移位指令、增1、减1指令等,这都是一地址指令。,2020年6月9日星期二,9,指令系统及汇编语言程序设计,大多数运算指令是双操作指令,如算术和逻辑运算指令,对于这种指令,有的机器采用三地址指令,除指出参加运算的两个操作数以外,还指出运算结果存放地址,现大多数计算机采用二地址指令,此时分别称两个操作数为原操作数和目的操作数。,2020年6月9日星期二,10,指令系统及汇编语言程序设计,尽管在指令执行前这两个操作数都是原始操作数,但指令执行后将把运算结果存放到目的操作数的地址中去,当然目的操作数的原始数据将会丢失。如果此原始数据在以后的运算中还会用到,那么必须在运算之前给它准备一个副本(即预先存储在内存或寄存器中)。8086/8088的运算指令就采用这种二地址指令。,2020年6月9日星期二,11,指令系统及汇编语言程序设计,三、寻址方式指令中操作数字段实质上指出参加操作运算的操作数存放于何处。一般说来,操作数可以存放在指令代码中,称为立即数。操作数也可以存放在CPU的内部寄存器中,称为寄存器操作数。操作数绝大多数存放在存储器中,称为存储器操作数。对于一部分I/O指令来说,操作数可以存放在接口电路的寄存器中。,2020年6月9日星期二,12,指令系统及汇编语言程序设计,指定立即数和寄存器操作数的表示方法比较简单。而对存储器操作数来说,一个存储单元的地址就需要20位,怎样设法使它在指令的操作数字段的表示中减少位数呢?另外,从程序运行时的数据结构来看,操作数常常不是单个的数,往往是成组的以表格或数组形式存放在存储器的某一区域中,在这种情况下,指令用什么方式来指定操作数的地址更好呢?,2020年6月9日星期二,13,指令系统及汇编语言程序设计,从程序设计的通用性来看,操作数或操作数存放的地址在指令中的指定应具有易于改变的灵活性,因此,需要有多种方式来指定操作数或操作数地址的问题。指令中用于说明操作数所在地址的方法,称为寻址方式。,2020年6月9日星期二,14,指令系统及汇编语言程序设计,我们知道,计算机只能识别二进制代码,机器指令是由二进制代码组成的,这种指令称为机器码,机器码是由一串0和1组成,没有明显的特征,人们不好记忆,不易理解,易出错。所以,编制程序成为一种十分困难和繁琐的工作。,2020年6月9日星期二,15,指令系统及汇编语言程序设计,因而人们就用一些助记符通常是指令功能的英文词的缩写来代替操作码。如8086/8088中,数的传送指令用助记符MOV(MOVE缩写)表示。例:MOVDS,AX机器码:8ED8。MOVBP,SP机器码:8BEC。MOVAX,ES:BX机器码:268B07,2020年6月9日星期二,16,指令系统及汇编语言程序设计,这样,每条指令有明显的特征,易于理解和记忆,也不易出错,此即汇编语言阶段。汇编语言书写的指令操作码用助记符代替,操作数也可用符号或符号地址(称为标号)来表示,它与机器指令是一一对应的。本章均用汇编语言格式书写指令。,2020年6月9日星期二,17,指令系统及汇编语言程序设计,汇编语言指令的特点源程序中要使用指令,指令是最小的代码单元。指令分为两种,一种叫硬指令,另一种叫伪指令。硬指令是机器事实上存在的指令例如:MOVAX,1234在源程序中写下这条指令,生成可执行文件后,反汇编仍然存在这条指令。,2020年6月9日星期二,18,指令系统及汇编语言程序设计,伪指令是告诉编译器的一些说明性语句,编译器承认,而CPU中无此指令。例如:X1DW0这是一条用伪指令DW定义字变量的语句,编译器会将它在数据段中产生一个字的空间且初始化为0。程序中并没有X1这个变量,其它指令操作该变量都会被编译成从X1的地址读写数据。,2020年6月9日星期二,19,指令系统及汇编语言程序设计,四、指令的执行时间一条指令的执行时间是取指令、取操作数、执行指令及传送结果各个阶段所需时间的总和。详细讨论各种指令的执行时间是个比较复杂的问题,在此,只讨论一些一般的概念。,2020年6月9日星期二,20,指令系统及汇编语言程序设计,指令的基本执行时间因指令的不同而异,相互之间有很大的差异,而取、存操作数时间又因不同的寻址方式而有所不同。当需要访问存储器以取得操作数时,还需要考虑计算有效地址EA所需要的时间。,2020年6月9日星期二,21,指令系统及汇编语言程序设计,表1表3所列为执行不同指令所需的时间、执行加法指令时不同的寻址方式所需的时间,以及在不同的寻址方式下计算EA所需的时间。在这些表格中,所有的时间都是以时钟周期数表示的。,2020年6月9日星期二,22,指令系统及汇编语言程序设计,另外,从表1表3可以看出,不仅不同指令的执行时间差别很大,而且,当同一种指令使用不同寻址方式时,指令的执行时间差别也是很大的。表4列出了8086/8088常用指令的执行时间。,2020年6月9日星期二,23,指令系统及汇编语言程序设计,例:假设时钟频率为5MHz,则一个时钟周期为0.2us,求下列指令的执行时间。寄存器寄存器方式,加法ADD指令。则ADD指令的执行时间:T=30.2=0.6us。,2020年6月9日星期二,24,指令系统及汇编语言程序设计,存储器寄存器方式,若存储器使用相对基址变址寻址方式,则:T=(9+EA)0.2=(9+12)0.2=4.2us。如果在此种寻址方式下,求得的存储器有效地址为奇数,则根据IBMPC的规定,需要多访问一次存储器,即要增加4个时钟周期数,则t=(9+12+4)0.2=5us,2020年6月9日星期二,25,指令系统及汇编语言程序设计,寄存器存储器方式,此时,若存储器使用相对地址变址方式,则:t=(16+EA)0.2=(16+12)0.2=5.6us。如果此时求得的是奇地址,则需要时间为:t=(16+12+8)0.2=7.2us。,2020年6月9日星期二,26,指令系统及汇编语言程序设计,可见,即使是同一种ADD指令,不同的寻址方式也可以使它的执行时间相差一个数量级。因此合理选择指令和寻址方式是很重要的,进而可知,用以完成同样功能的不同程序,在占用空间和执行时间上可能有很大的差别。,2020年6月9日星期二,27,指令系统及汇编语言程序设计,因此,在编制汇编程序时,如果对程序所占的存储空间或程序的执行时间要求不高,那么只需根据题意编制出合乎要求的程序就可以了(当然,如果能提高程序的空间效率和时间效率,则更为理想)。,2020年6月9日星期二,28,指令系统及汇编语言程序设计,若对程序所占有的存储空间或者对于执行的时间要求很高,那么应仔细斟酌程序算法、数据结构及指令与寻址方式的选用,以便编制出符合要求的程序。,2020年6月9日星期二,29,指令系统及汇编语言程序设计,28086/8088的寻址方式一、几个概念的说明1操作数的种类数据操作数这类操作数是与数据有关的操作数,即指令中操作的对象是数据,数据操作数又可分为:,2020年6月9日星期二,30,指令系统及汇编语言程序设计,立即数操作数指令中要操作的数据在指令中。寄存器操作数指令中要操作的数据存放在指定的寄存器中。存储器操作数指令中要操作的数据存放在指定的存储单元中。I/O操作数指令中要操作的数据来自或送到I/O端口。,2020年6月9日星期二,31,指令系统及汇编语言程序设计,转移地址操作数这类操作数是与转移地址有关的操作数,即指令中操作的对象不是数据,而是要转移的目标地址。转移地址操作数也可分为:立即数操作数、寄存器操作数、存储器操作数。,2020年6月9日星期二,32,指令系统及汇编语言程序设计,2有效地址EA当操作数是存放在存储器中时,存储器的存储单元的物理地址由两部分组成,一部分是偏移地址,一部分是段地址。在8086/8088的各种寻址方式中,寻找存储单元所需的偏移地址可由各种成分组成,称为有效地址,用EA表示,不同的寻址方式,组成有效地址EA的各部分内容也不一样,详见后面的讨论说明。,2020年6月9日星期二,33,指令系统及汇编语言程序设计,3段超越存储器操作数寻址时,存储单元的物理地址的另一部分是段地址,对段地址是如何规定的呢?8086/8088指令系统中对段地址有两个基本规定,即所谓的Default(默认)状态。,2020年6月9日星期二,34,指令系统及汇编语言程序设计,在正常情况下,由寻址方式中有效地址规定的基地址寄存器来确定段寄存器,即只要寻址方式中出现BP寄存器作为基地址,段寄存器一定采用堆栈段SS段寄存器。其余的情况都采用DS段寄存器(注:串处理指令有另外规定)。,2020年6月9日星期二,35,指令系统及汇编语言程序设计,物理地址=DS16(10H)+偏移地址指令中的操作数也可以不在基本规定的段区域,但是必须在指令中指定段寄存器,这就是段超越。例:MOVAL,2000H;物理地址=DS16+2000HMOVAL,ES:2000H;物理地址=ES16+2000H段地址的基本规定和允许超越的情况如下表1所示:,2020年6月9日星期二,36,指令系统及汇编语言程序设计,二、与数据有关的寻址方式8086/8088指令中数据(操作数)有7种寻址方式。,说明操作数所在地址的寻址方式,立即数寻址直接寻址寄存器寻址寄存器间接寻址寄存器相对寻址基址变址寻址基址变址相对寻址,2020年6月9日星期二,37,与数据有关的寻址方式,1立即寻址方式操作数直接存放在指令中,紧跟在操作码之后,它作为指令的操作码字段存放在指令代码中,这种数称为立即数。立即数可以是8位的或16位的,如果是16位立即数,则低位字节数存放在低地址单元中(紧跟在操作码之后),高位字节数存放在高地址单元中。指令码存放形式如图所示:,2020年6月9日星期二,38,与数据有关的寻址方式,例1:MOVAL,05H;AL05H,指令执行后,AL=05H,8位数据05H存入AL寄存器。操作的示意图如图所示。,指令功能,执行过程,演示,2020年6月9日星期二,39,与数据有关的寻址方式,例2:MOVAX,0102H;AX0102H,指令执行后,AX=0102H,16位数据存入AX寄存器,其中(AH)=01H,(AL)=02H。操作示意图如图所示。,演示,2020年6月9日星期二,40,与数据有关的寻址方式,例3:MOVAX,COUNT;AXCOUNT在汇编语言指令中,可以用符号COUNT代替常数,但是COUNT必须用伪指令EQU来赋值。,2020年6月9日星期二,41,与数据有关的寻址方式,立即数寻址方式主要用来对寄存器赋值,由于在执行的过程中,立即数可以从指令队列中直接取得,CPU不必执行总线周期,指令执行速度快。注:立即数只能是整数,只能作为源操作数。,2020年6月9日星期二,42,与数据有关的寻址方式,2寄存器寻址方式操作数在寄存器中,指令指定寄存器号。对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP和BP等;对于8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH和DL等。这种寻址方式由于操作数在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度。,2020年6月9日星期二,43,与数据有关的寻址方式,这种寻址方式寻找操作数的示意图如下:,2020年6月9日星期二,44,与数据有关的寻址方式,例:MOVBX,AX;BXAX若指令执行前,AX=3064H,BX=1234H则指令执行后,AX=124H,BX=1234H除上述两种寻址方式以外,以下介绍的各种寻址方式的操作数都是存放在代码段以外的存储器区段中。,指令功能,执行过程,演示,2020年6月9日星期二,45,与数据有关的寻址方式,3直接寻址方式(Directaddressing),在直接寻址方式中,有效地址EA就在指令代码中,它存放在代码段中指令操作码后面的操作数字段,指令码表示如图。,2020年6月9日星期二,46,与数据有关的寻址方式,此寻址方式与立即寻址方式相比较,在指令代码中,直接寻址的操作数字段是偏移地址,立即寻址的操作数字段是立即数。由于操作数在正常情况下是存放在数据段中,所以必须先求出操作数的物理地址,然后再按照此地址访问存储器才能取得或存入数据。,2020年6月9日星期二,47,与数据有关的寻址方式,操作数物理地址(PA)为:PA=DS10H+EA其寻址方式示意图如图所示。,物理地址,2020年6月9日星期二,48,与数据有关的寻址方式,8086/8088允许数据存放在数据段以外的其它段中,此时在指令中应指定段超越的段寄存器名,在计算物理地址时应使用指定的段寄存器。,2020年6月9日星期二,49,与数据有关的寻址方式,例1:MOVAX,1000H;将有效地址EA=1000H单元中的内容传送到AX寄存器。如DS=2000H,从指令可知,EA=1000H。存放源操作数的存储单元的物理地址为:PA=DS10H+EA=20000+1000=21000H。假设指令执行前,AX=7850H,(21000H)=78H,(21001H)=56H。指令执行后:AX=5678H,(21000H)=78H,(21001H)=56H。指令执行情况如图所示。,指令功能,执行过程,演示,2020年6月9日星期二,50,与数据有关的寻址方式,在汇编语言中,可用符号地址代替数值地址,如:例2:MOVAX,VALUE其中VALUE即为存放源操作数的符号地址(有效地址EA),需用伪地址定义,此指令也可写成:MOVAX,VALUE。源操作数的存储单元也可以存放在其它段中,但必须在指令中指定段超越前缀,如:MOVAX,ES:2000HMOVAX,SS:VALUE,2020年6月9日星期二,51,与数据有关的寻址方式,4寄存器间接寻址方式操作数的有效地址在基址寄存器BX,BP或变址寄存器SI,DI中,操作数则在存储器中,此种寻址方式示意图如图所示。,物理地址,2020年6月9日星期二,52,与数据有关的寻址方式,如果指令指定的寄存器是BX,SI和DI,则操作数必定在数据段中,以DS段寄存器的内容作为段地址,操作数的物理地址为:PA=16DS+BX或PA=16DS+SI或PA=16DS+DI,2020年6月9日星期二,53,与数据有关的寻址方式,如指令中指定的寄存器是BP,则操作数必定在堆栈段中,以SS段寄存器的内容作为段地址,操作数的物理地址为:PA=16SS+BP,2020年6月9日星期二,54,与数据有关的寻址方式,例1:MOVAX,BX若DS=2000H,BX=1000H,则PA=20000+1000=21000H。指令执行前:AX=8040H,(21000H)=A0H,(21001H)=50H指令执行后:AX=50A0H,(21000H)=A0H,(21001H)=50H例1执行情况示意如图所示。,指令功能,执行过程,演示,2020年6月9日星期二,55,与数据有关的寻址方式,指令中也可以指定段超越前缀来使操作数存放在其它段中。如:例2:MOVAX,SS:BX这时PA=16SS+BX这种寻址方式适用于表格处理,执行完一条指令后,只需修改寄存器内容,就可以取出表格中的下一项。,2020年6月9日星期二,56,与数据有关的寻址方式,5寄存器相对寻址(或称直接变址寻址)操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位偏移量(displacement)之和。,2020年6月9日星期二,57,与数据有关的寻址方式,2020年6月9日星期二,58,与数据有关的寻址方式,对于BX,SI,DI寄存器,段寄存器用DS,对于BP寄存器,段寄存器用SS,其物理地址(PA)为:,2020年6月9日星期二,59,与数据有关的寻址方式,这种寻址方式示意如图所示。,物理地址,2020年6月9日星期二,60,与数据有关的寻址方式,例1:MOVAX,dispSI或MOVAX,SI+disp其中disp为16位偏移量,它是符号地址。实际上disp究竟是8位还是16位偏移量,可由伪指令来定义。,2020年6月9日星期二,61,与数据有关的寻址方式,如DS=3000H,SI=2000H,disp=3000H。则EA=SI+disp=2000H+3000H=5000H物理地址PA=16DS+EA=30000H+5000H=35000H指令执行前:AX=7A6CH,(35000H)=34H,(35001H)=12H。指令执行后:AX=1234H,(35000H)=34H,(35001H)=12H。,2020年6月9日星期二,62,与数据有关的寻址方式,例1执行情况示意如图所示。,指令功能,执行过程,演示,2020年6月9日星期二,63,与数据有关的寻址方式,同样,这种寻址方式也可采用段超越。如:例2:MOVDL,ES:dispDI则:EA=disp+DI,PA=16ES+disp+DI这种寻址方式也适用于表格处理。,2020年6月9日星期二,64,与数据有关的寻址方式,6基址变址寻址方式操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。两个寄存器均由指令指定。,2020年6月9日星期二,65,与数据有关的寻址方式,如基址寄存器为BX,段寄存器使用DS;基址寄存器为BP,段寄存器使用SS。因此物理地址为:物理地址=16DS+BX+SI;物理地址=16DS+BX+DI物理地址=16SS+BP+SI;物理地址=16SS+BP+DI,2020年6月9日星期二,66,与数据有关的寻址方式,这种寻址方式如下图:,物理地址,2020年6月9日星期二,67,与数据有关的寻址方式,例1:MOVAX,BXDI或MOVAX,BX+DI如DS=3000H,BX=6780H,DI=0041H。则EA=6780H+0041H=67C1H,源操作数存放单元的物理地址为:PA=30000H+67C1H=367C1H。指令执行前:AX=8957H,(367C1H)=34H,(367C2H)=12H。指令执行后:AX=1234H,(367C1H)=34H,(367C2H)=12H。,2020年6月9日星期二,68,与数据有关的寻址方式,例1执行情况示意如图所示。,2020年6月9日星期二,69,与数据有关的寻址方式,这种寻址方式使用段超越的格式为:例2:MOVAX,ES:BXSI此寻址方式适用与数组和表格处理。,指令功能,执行过程,演示,2020年6月9日星期二,70,与数据有关的寻址方式,7相对基址变址寻址操作数的有效地址是一个基址寄存器内容,一个变址寄存器的内容和8位或16位偏移量之和。当基址寄存器为BX,段寄存器用DS;当基址寄存器为BP,段寄存器用SS;,2020年6月9日星期二,71,与数据有关的寻址方式,其物理地址为:,2020年6月9日星期二,72,与数据有关的寻址方式,这种寻址方式的寻址示意如图所示。,2020年6月9日星期二,73,与数据有关的寻址方式,例1:MOVAX,dispBXSI或MOVAX,dispBX+SI或MOVAX,disp+BX+SI如DS=5000H,BX=1C7AH,SI=0135H,disp=0200H。则物理地址为:物理地址=50000H+1C7AH+0135H+0200H=51FAFH,2020年6月9日星期二,74,与数据有关的寻址方式,例1执行情况示意如图所示。,指令功能,执行过程,演示,2020年6月9日星期二,75,与数据有关的寻址方式,练习:若:BX=0158H,DI=10A5H,偏移量(disp)=1B57H,DS=2100H,SS=1100H,BP=0100H,段寄存器按默认段寄存器,计算相对于存储器寻址的各种寻址方式的有效地址和物理地址。,2020年6月9日星期二,76,与数据有关的寻址方式,直接寻址:寄存器间接寻址(设寄存器为BX):寄存器相对寻址(设寄存器为BP):基址变址寻址(设寄存器为BX和DI):基址变址相对寻址(设寄存器为BP和DI):,直接寻址:EA=1B57H;PA=16DS+EA=21000H+1B57H=22B57H,寄存器间接寻址(设寄存器为BX):EA=0158H;PA=16DS+EA=21000H+0158H=21158H,寄存器相对寻址(设寄存器为BP):EA=BP+disp=0100H+1B57H=1C57HPA=16SS+EA=11000H+1C57H=12C57H,基址变址寻址(设寄存器为BX和DI):EA=BX+DI=0158H+10A5H=11FDHPA=16DS+EA=21000H+11FDH=221FDH,基址变址相对寻址(设寄存器为BP和DI):EA=BP+DI+disp=0100H+10A5H+1B57H=2CFCHPA=16SS+EA=11000H+2CFCH=13CFCH,2020年6月9日星期二,77,8086/8088指令系统,38086/8088指令系统8086/8088CPU指令系统分为6大类(传送指令、算术指令、逻辑运算和移位指令、串操作指令、程序控制指令、处理器控制指令)。,2020年6月9日星期二,78,8086/8088指令系统,一、数据传送类指令数据传送类指令是指令系统中用得最多的一类指令,也是条数最多的一类指令(14条),常用于将原始数据、中间运算结果、最终结果及其他信息在CPU的寄存器和存储器之间进行传送。根据功能的不同,数据传送类指令可分为:,2020年6月9日星期二,79,8086/8088指令系统,通用数据传送指令:MOV交换指令:XCHG堆栈操作指令:PUSH,POP地址传送操作指令:LEA,LDS,LES标志寄存器传送指令:LAHF,SAHF,PUSHF,POPF累加器专用传送指令:IN,OUT,XLAT,2020年6月9日星期二,80,8086/8088指令系统,1通用数据传送指令MOV传送指令格式:MOVDST,SRC执行的操作:(DST)(SRC)其中DST表示目的操作数,SRC表示源操作数。功能:此指令把一个字节或一个字操作数从源传送到目的,源操作数内容未变,目的操作数内容和源操作数内容相同。演示,2020年6月9日星期二,81,8086/8088指令系统,MOV指令有九种形式,如图所示。,2020年6月9日星期二,82,8086/8088指令系统,从累加器送到存储器格式:MOVMEM,AC;(mem)ac(ac表示AX,AH,AL)从存储器送累加器格式:MOVAX,DISPBPSI;把地址SS10H+(BP)+(SI)+DISP存储单元的内容送AX,8086/8088指令系统,从存储器或寄存器送到段寄存器格式:MOVsegreg,mem/reg;segreg(mem/reg)其中segreg表示不包括CS的段寄存器(SS,DS,ES),本指令只能是字操作。,2020年6月9日星期二,84,8086/8088指令系统,从段寄存器到寄存器或存储器格式:MOVmem/reg,segreg;(mem/reg)segreg规定同,但segreg包括CS,即CS,SS,DS,ES。,8086/8088指令系统,从寄存器到寄存器格式:MOVreg1,reg2;reg1reg2注:两个寄存器之间传送时,只能相同字长的寄存器之间传送,不能在不同字长寄存器之间传送。,2020年6月9日星期二,86,8086/8088指令系统,从寄存器到存储器格式:MOVmem,reg;(mem)reg此指令可以是字操作,也可以是字节操作。从存储器到寄存器格式:MOVreg,mem;reg(mem)与传送方向相反,规定相同。,2020年6月9日星期二,87,8086/8088指令系统,立即数送寄存器格式:MOVreg,data;regdataData是8位或16位立即数,ASCII字符。Data数据类型必须与寄存器字长相一致。8位数可以送16位寄存器,但16位数不能送8位寄存器。,2020年6月9日星期二,88,8086/8088指令系统,立即数送存储器格式:MOVmem,data;(mem)data规定同,但对mem存储操作数必须作数据类型说明。,数据类型,BYTEPTR字节操作,WORDPTR字操作,2020年6月9日星期二,89,8086/8088指令系统,注意点:MOV指令的目的操作数不允许用立即数方式,也不允许使用CS段寄存器,而且除源操作数为立即数的情况外,两个操作数中必须有一个是寄存器。不允许mem直接之间传送;也不允许在两个段寄存器之间直接传送。MOV指令不影响标志位。,8086/8088指令系统,在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令MOVAL,050AH;非法指令,修正:;movax,050ahMOVSI,DL;非法指令,修正:;movdh,0;movsi,dx,非法指令两个操作数类型不一致,8086/8088指令系统,当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明,非法指令无法确定是字节量还是字量操作,MOVBX+SI,255;非法指令,修正:;movbyteptrbx+si,255;byteptr说明是字节操作;movwordptrbx+si,255;wordptr说明是字操作,8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数),非法指令两个操作数都是存储器,MOVbuf2,buf1;非法指令,修正:;假设buf2和buf1是两个字变量;movax,buf1;movbuf2,ax;假设buf2和buf1是两个字节变量;moval,buf1;movbuf2,al,8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活,非法指令段寄存器的操作有一些限制,MOVDS,ES;非法指令,修正:;movax,es;movds,axMOVDS,100H;非法指令,修正:;movax,100h;movds,axMOVCS,SI;非法指令;指令存在,但不能执行,2020年6月9日星期二,94,8086/8088指令系统,例1:立即数送通用寄存器或存储器MOVAL,55HMOVAX,55AAHMOVCX,0F943HMOVBYTEPTRBX,12H;DS:BX12HMOVWORDPTRBX+SI,100H;DS:BX+SI100H,2020年6月9日星期二,95,8086/8088指令系统,用Debug来观察寄存器与内存数据的变化,过程如下所示。MicrosoftWindowsXPVersion5.1.2600(C)Copyright1985-2001MicrosoftCorp.C:DocumentsandSettingsshsdebug-a1000AF5:0100movax,550AF5:0103movax,55aa0AF5:0106movcx,f9430AF5:0109movbyteptrbx,120AF5:010Cmovwordptrbx+si,1000AF5:0110,2020年6月9日星期二,96,8086/8088指令系统,-t=0af5:100AX=0055BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=0103NVUPEIPLNZNAPONC0AF5:0103B8AA55MOVAX,55AA,执行完第一条指令,AX=0055,2020年6月9日星期二,97,8086/8088指令系统,-tAX=55AABX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=0106NVUPEIPLNZNAPONC0AF5:0106B943F9MOVCX,F943,执行完第二条指令,AX=55AA,2020年6月9日星期二,98,8086/8088指令系统,-tAX=55AABX=0000CX=F943DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=0109NVUPEIPLNZNAPONC0AF5:0109C60712MOVBYTEPTRBX,12DS:0000=CD,执行完第三条指令,CX=F943,2020年6月9日星期二,99,8086/8088指令系统,-dds:0000,000f0AF5:0000CD20FF9F009AEEFE-1DF04F0359058A03.O.Y.,查看当前的内存数据,00=CD,2020年6月9日星期二,100,8086/8088指令系统,-tAX=55AABX=0000CX=F943DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=010CNVUPEIPLNZNAPONC0AF5:010CC7000001MOVWORDPTRBX+SI,0100DS:0000=2012,执行完第四条指令,2020年6月9日星期二,101,8086/8088指令系统,-dds:0000,000f0AF5:00001220FF9F009AEEFE-1DF04F0359058A03.O.Y.,查看当前的内存数据,00=12,2020年6月9日星期二,102,8086/8088指令系统,-tAX=55AABX=0000CX=F943DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=0110NVUPEIPLNZNAPONC0AF5:011021725FANDBP+SI+5F,SISS:005F=2020,执行完第五条指令,2020年6月9日星期二,103,8086/8088指令系统,-dds:0000,000f0AF5:00000001FF9F009AEEFE-1DF04F0359058A03.O.Y.,查看当前的内存数据,0001=0001,DEBUG中标志位的符号表示,2020年6月9日星期二,104,8086/8088指令系统,2堆栈操作指令PUSH,POP堆栈是在存储器(内存)中开辟出的一个存储区,位于堆栈段中。堆栈是以“后进先出”的方式进行数据操作。,2020年6月9日星期二,105,8086/8088指令系统,从8086/8088的堆栈组织形式来看,堆栈是从高地址向低地址方向生长的,堆栈只有一个出、入口,所以只有一个堆栈指针寄存器SP,它的内容在任何时候都指向当前的栈顶(在开始时,它指在堆栈的最低部,最高的地址),也就是最近入栈数据的所在存储单元,如图所示。,2020年6月9日星期二,106,8086/8088指令系统,2020年6月9日星期二,107,8086/8088指令系统,堆栈的操作有两种,入栈和出栈。PUSH入栈指令格式:PUSHSRC执行的操作:(SP-1)(SP-2)(SRC);SPSP-2其中SRC是入栈的字操作数(只能是字操作数),除了不允许用立即数外,寄存器、段寄存器(全部)和存储器操作数都能入栈。,2020年6月9日星期二,108,8086/8088指令系统,执行的操作内容为:SRC=字数据(高位字节先入栈,低位字节后入栈),送入SP-1和SP-2的两个存储单元。SP指针的内容随之减2,SP=SP-2演示,2020年6月9日星期二,109,8086/8088指令系统,例1:将3125压入堆栈。MOVAX,3125PUSHAX指令执行前:SP=2500H,SS=5000H,AX=3125H。则物理地址=52500H。指令执行后:AX=3152H,SP=24FEH。例1执行情况示意图如图所示。,2020年6月9日星期二,110,8086/8088指令系统,2020年6月9日星期二,111,8086/8088指令系统,用Debug来观察SP的变化情况。MicrosoftWindowsXPVersion5.1.2600(C)Copyright1985-2001MicrosoftCorp.C:DocumentsandSettingsshsdebug-a1000AF5:0100movax,31250AF5:0103movsp,25000AF5:0106pushax0AF5:0107,2020年6月9日星期二,112,8086/8088指令系统,-t=0af5:100AX=3125BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=0103NVUPEIPLNZNAPONC执行0AF5:0103BC0025MOVSP,2500,执行第一条指令,AX=3125,2020年6月9日星期二,113,8086/8088指令系统,-tAX=3125BX=0000CX=0000DX=0000SP=2500BP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=0106NVUPEIPLNZNAPONC0AF5:010650PUSHAX,执行第二条指令,SP=2500,2020年6月9日星期二,114,8086/8088指令系统,-tAX=3125BX=0000CX=0000DX=0000SP=24FEBP=0000SI=0000DI=0000DS=0AF5ES=0AF5SS=0AF5CS=0AF5IP=0107NVUPEIPLNZNAPONC0AF5:01073EDS:0AF5:0108C5960074LDSDX,BP+7400DS:7400=0000,执行第三条指令,SP=25FE,2020年6月9日星期二,115,8086/8088指令系统,例2:PUSHdispBXSI;将某存储单元内容压入堆栈如DS=2000H,BX=2100H,SI=2520H,disp=FFF4H。则操作数存储单元的物理地址。PA=20000+2100+2520+FFF4=24614H。指令执行前:SS=5000H,SP=8FF2H,则物理地址=50000+8FF2H=58FF2H。(24614H)=7AH,(24615H)=26H。例2执行情况示意图如图所示。,2020年6月9日星期二,116,8086/8088指令系统,指令执行后:SP=8FF0H,SS:(58FF0H)=7A,SS:(58FF1H)=26H。,2020年6月9日星期二,117,8086/8088指令系统,出栈指令POP格式:POPDST执行操作:DST(SP+1),(SP);SPSP+2其中DST是出栈的字操作数的目的地址,除了CS和立即数外,其它均可。操作过程为:SP和SP+1两个栈顶单元的内容(SP为低位字节,SP+1位高位字节)送入DST。(SP到DST的低位,SP+1到DST的高位)SP指针内容为SP+2。演示,2020年6月9日星期二,118,8086/8088指令系统,例1:POPBX设SS=5000H。指令执行前:BX=7A85H,SP=1000H。则物理地址=51000H。堆栈存储情况如图所示。(执行前)执行时,首先将SP=1000H内容6B送入BL,SP+1=1001SP(NEW),然后SP=1001所指单元内容送入BH,SP+1=1002SP(NEW)。指令执行后:BX=486BH,SP=1002H。堆栈存储情况如图所示。(执行后),2020年6月9日星期二,119,8086/8088指令系统,2020年6月9日星期二,120,8086/8088指令系统,例2:POPSI;将堆栈栈顶单元的内容弹出送到存储器的某存储单元设DS=2000H。SI=1200H,则存储单元物理地址=21200H。指令执行前:SS=5000H,SP=3020H,(21200H)=00H,(21201H)=12H。数据区和堆栈区存储情况如图所示。,2020年6月9日星期二,121,8086/8088指令系统,2020年6月9日星期二,122,8086/8088指令系统,指令执行时:首先将SP=3020H所指单元内容7F送入21200H单元,SP+1=3021SP(new),然后再将SP=3021H所指单元内容C5H送入21201单元,SP+1=3022HSP(new)。示意图如图所示。,2020年6月9日星期二,123,8086/8088指令系统,指令执行后:SP=3022H,(21200H)=7FH,(21201H)=C5H。,2020年6月9日星期二,124,8086/8088指令系统,堆栈在计算机中起重要作用,如果在程序中要用到某写寄存器,担它们的原来内容在后面程序中还要用,这时就可用堆栈暂时保存起来,然后在用到这些内容上时再恢复原来的内容,特别是在子程序调用和中断时,在子程序和中断服务程序中保护现场和恢复现场时,要用到入栈和出栈命令。,2020年6月9日星期二,125,8086/8088指令系统,形式如下:PUSHAX;保存AXPUSHBX;保存BX;此程序要到AX,BX,需保AX,BXPOPBX;恢复BXPOPAX;恢复AX,2020年6月9日星期二,126,8086/8088指令系统,3累加器专用传送指令:IN,OUT,XLAT累加器专用传送指令共有三条,它包括输入/输出(I/O)指令和换码指令XLAT。,2020年6月9日星期二,127,8086/8088指令系统,输入/输出指令共有两条:IN和OUT,它用来实现累加器(AX/AL)与I/O端口之间的数据传送,执行输入指令时CPU可以从一个端口(8位)读入一个字节到AL中,也可以从两个连续的8位端口读一个字到AX中。执行输出指令时,CPU可将AL中的一个字节写到一个8位端口中,也可以将AX中的一个字写到两个连续的8位端口中。,2020年6月9日星期二,128,8086/8088指令系统,8086系统的I/O指令中有以下两种寻址方式:直接寻址方式:指令中直接指出一个8位的I/O端口地址,端口地址为00FFH。寄存器间接寻址方式:当端口地址大于FFH(100HFFFFH)时,端口地址由DX寄存器指定(也只能由DX指定)。当然,DX中也可存放8位的端口地址。,2020年6月9日星期二,129,8086/8088指令系统,(1)输入指令IN演示IN指令的一般形式为:INAL/AX,port;直接寻址,port为8位立即数表示的端口地址或INAL/AX,DX;间接寻址,由DX指出8位或16位端口地址,2020年6月9日星期二,130,8086/8088指令系统,例如:INAL,38H;将38H端口的字节读入ALINAL,DX;从DX所指端口中读取一个字节到ALINAX,50H;将50H、51H两端口的一个字读入AX,其中50H端口的字节读入AL,51H端口中的字节读入AHINAX,DX;从DX和DX+1所指的两个端口中读取一个字到AX,低地址端口中的字节读入AL,高地址端口中的字节读入AH,2020年6月9日星期二,131,8086/8088指令系统,(2)输出指令OUT演示OUT指令的一般形式为:OUTport,AL/AX;直接寻址,port为8位立即数表示的端口地址OUTDX,AL/AX;间接寻址,DX给出8位或16位端口地址,2020年6月9日星期二,132,8086/8088指令系统,例如:OUT35H,AL;将AL中的一个字节输出到35H端口OUT60H,AX;将AX中的一个字输出到60H、61H两端口,其中AL中的内容输出到60H,AH中的内容输出到61HOUTDX,AX;将AX中的一个字输出到DX及DX+1所指的端口中,(3)XLAT(换码指令)格式:XLAT功能:bx+alal这条指令没有明显的操作数,其操作数需要另外的指令提供,所以单独执行该指令不能达到预期的目的。,2020年6月9日星期二,133,8086/8088指令系统,执行该指令之前,需先执行两条指令:MOVBX,表的偏移首地址MOVAL,被转换码由于该指令不能单独执行,有时称为复合指令。演示,2020年6月9日星期二,134,8086/8088指令系统,例1:查表求n的平方。n:0-9解:建立一个09的平方表,将09的平方表建在偏移地址为2000H的内存中,如图,2020年6月9日星期二,135,8086/8088指令系统,完成求5的平方指令序列为:MOVBX,2000H;指向平方表的首地址MOVAL,5;将5换码成5的平方值XLA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论