版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理及应用项目7:数据传送指令第1讲数据传送指令之MOV指令从这一节开始,我们将讲解8086的指令系统数据传送指令之MOV指令在8086的指令系统中,我们将会介绍数据传送类指令、算术运算指令,逻辑运算指令和移位指令、串操作指令,程序控制指令和处理器控制指令共六大类指令数据传送类指令算术运算指令逻辑运算指令和移位指令串操作指令程序控制指令处理器控制指令0102030405068086指令系统首先,我们来讲解数据传送指令,数据传送指令的主要功能就是进行数据的传送,包括存储器、寄存器以及IO接口之间的传送数据传送类指令01存储器数据传送寄存器iO接口三者之间传送传送指令主要分为以下四种,通用传送指令,目的地址传送指令、标志传送指令和输入输出传送指令数据传送类指令01通用传送指令目的地址传送指令标志传送指令输入输出传送指令通用传送指令目的地址传送指令标志传送指令输入输出传送指令我们将会重点介绍通用传送指令,数据传送类指令01重点包括一般数据传送指令、输入输出指令、地址传送指令和标志传送指令数据传送类指令01一般数据传送指令通用传送指令一般数据传送:MOV、PUSH、POP、CBW输入输出指令:IN、OUT地址传送指令:LEA标志传送指令:PUSHF、POPFMOVPUSHPOPCBW输入输出指令地址传送指令INOUTLEA标志传送指令PUSHFPOPF首先来看一下一般数据传送指令中的MOV指令数据传送类指令01一般数据传送指令通用传送指令MOVPUSHPOPCBW输入输出指令地址传送指令INOUTLEA标志传送指令PUSHFPOPFMOV指令非常的常用,我们在前面已经举了很多例子,同学们对它也不陌生了,MOV常用不陌生MOV指令为社么这么重要呢?MOV指令为什么重要?主要是它的操作比较简单,而且他的使用规则对很多双操作数的指令都是适用的,所以学习好MOV指令有事半功倍的作用操作简单使用规则对双操作数的指令适用学习好MOV指令有事半功倍作用MOVMOV指令的书写规则是move后边是目的操作数,逗号后面是原操作数,MOVDest,SrcMOVDest,SrcDest目的操作数Src原操作数MOVmoveMOVmove它的操作就是把源操作数的内容传送到目的操作数中MOVDest,Src原操作数内容目的操作数MOVDest,SrcMOVmoveMOV指令是双操作数指令,它要求逗号两边的操作数的字长相同,DestSrc双操作数字长相同MOVmove正是因为有了这个要求,那么源操作数和目的操作数至少有一个的字长是确定的MOVDest,SrcDestSrc至少有一个字长确定原操作数目的操作数说到这里,老师要强调一下,立即数和内存储器操作数其实是没有字长大小限制的,立即数操作数内存储器操作数无字长大小限制在立即数的前边加任意多的0都不会影响立即数的大小,而对于存储器操作数来说,方括号里面给出的只是要寻址的空间的起始偏移地址,并没有给定寻址空间的结束地址立即数操作数内存储器操作数在前加0不影响大小方括号里有起始偏移地址方括号里无结束地址所以对于立即数操作数和存储器操作数来说,都是没有字长限制的,立即数操作数内存储器操作数无字长限制因此,当MOV指令中出现了立即数操作数或存储器操作数时,同学们要注意,另外一个操作数是否限制了字长的大小立即数操作数内存储器操作数出现其中之一时另一个是否限制字长大小MOV比如说另一个操作数可能是寄存器,既可能是16位的寄存器,也可能是八位的寄存器,但,不管是16位的还是八位的寄存器,都限制了字长的大小,此时,立即数操作数或存储器操作数的字长就等于寄存器限定的字长传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位寄存器←→寄存器;寄存器←→段寄存器寄存器←→存储单元立即数→→寄存器立即数→→存储单元段寄存器←→存储单元寄存器16位寄存器8位寄存器限制字长大小立即数操作数存储器操作数字长等于寄存器限定字长MOV指令的应用非常广泛,MOV应用广泛它可以进行寄存器和寄存器之间的数据传送,数据传送寄存器寄存器寄存器和段寄存器之间的数据传送,数据传送寄存器段寄存器寄存器寄存器存储单元和寄存器之间的数据传送,将立即数传送到寄存器中,将立即数传送存储单元中,数据传送存储单元寄存器传送立即数传送立即数寄存器段寄存器寄存器寄存器或者存储单元和段寄存器之间进行数据传送数据传送存储单元段寄存器存储单元寄存器寄存器段寄存器寄存器寄存器我们来看一下MOV指令的使用规则MOV指令使用规则首先,源操作数和目的操作数的类型要一致MOV指令使用规则原操作数目的操作数类型需一致MOV指令使用规则MOV指令不允许直接在存储器操作数之间进行数据传送,也不允许将立即数直接传送到段寄存器,而且段寄存器之间也不能直接进行数据传送,不能直接在存储器操作数之间进行数据传送不能将立即数直接传送到段寄存器段寄存器之间不能直接进行数据传送IP和CS呢都不能成为目的操作数,flags也不能作为操作数使用MOV指令使用规则不能成为目的操作数不能作为操作数使用IPCSflags下面我们结合具体的指令来说明这些规则MOV规则说明首先是寄存器之间的数据传送,寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005H寄存器立即数段寄存器存储器例如,MOVbx,si,这是两个寄存器之间的传送,使用这条指令的时候要注意两个寄存器的大小要相同寄存器立即数段寄存器存储器寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005HMOVbxsi两个寄存器大小要相同MOVALCL再看立即数与寄存器的传送,MOVAL,5,寄存器立即数段寄存器存储器寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005HMOVAL5MOVAL5寄存器立即数段寄存器存储器这里5是立即数,本身是没有字长限制的,寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005H立即数无字长限制5寄存器立即数段寄存器存储器但是AL限制了字长是8个比特,所以这条指令是没有问题的,执行以后AL的值就是5寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005HMOVAL58个比特执行后AL=5MOVAL再看立即数向存储器传送的例子,MOVbytePTR[bp+si],5,这条指令中,源操作数是5,没有字长的限制,寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005H寄存器立即数段寄存器存储器MOVBYTEPTR[BP+SI]5原操作数无字长限制目的操作数是存储器操作数,本来也没有字长的限制,寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005H寄存器立即数段寄存器存储器MOVBYTEPTR[BP+SI]目的操作数存储器操作数无字长限制=5但是在方括号的前面加了byteptr以后,相当于加了一个字节的指针,这里PTR是pointer的缩写,是指针的意思,它限制了存储器操作数的字长是字节,也就是8个比特寄存器立即数段寄存器存储器MOVBYTEPTR[BP+SI]加一个字节指针Pointer:指针限制存储器操作数字长是字节8个比特同理,我们来看下面这条指令中,wordptr,是字指针,它限制了存储器操作数的字长是一个字,即是16位的。寄存器立即数段寄存器存储器MOVWORDPTR[BX],1005H字指针限制存储器操作数字长是一个字16位所以,这条指令中1005h这个立即数被限制为16位的立即数,寄存器立即数段寄存器存储器MOVWORDPTR[BX],1005H立即数16位立即数这两条指令是同学们需要特别注意的,是非常容易写错的指令寄存器立即数段寄存器存储器MOVWORDPTR[BX],1005HMOVBYTEPTR[BP+SI]易写错指令再来看这个存储器和寄存器之间的传送,MOV[bx],AX,这里bx被放到了方括号里面,所以它指向的是内存储器,它本身没有字长限制,寄存器立即数段寄存器存储器寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005HMOV[BX],AX内存储器无字长限制但是AX限制了字长是16位的,所以,这条指令会将AX的内存传送到段基址是DS,偏移地址是BX的两个连续的内存单元中寄存器立即数段寄存器存储器寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005HMOV[BX],AX限制字长16位将AX内存传送到段基址DS偏移地址:BX两个连续内存单元中再来看存储器跟段寄存器之间的的传送,MOV[bx],ES,可以在存储器和段寄存器之间直接传送数据寄存器立即数段寄存器存储器MOV[BX],ES寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005H直接数据传送最后是段寄存器跟寄存器之间的传送,相当于是直接给段寄存器赋值寄存器立即数段寄存器存储器寄存器存储器段寄存器立即数MOVBX,SIMOVAL,CLMOVDS,AXMOVAX,CSMOV[BX],ESMOVDS,[1000H]MOV[BX],AXMOVCL,[BP][DI]MOVBX,3078HMOVAL,5MOVBYTEPTR[BP+SI],5MOVWORDPTR[BX],1005H直接赋值MOV指令不允许直接进行但是还有一些数据传送是MOV指令不允许直接进行的,这种情况怎么办呢?部分数据传送怎么办?我们可以另想办法,如果直接传不行,那就间接传,我们可以使用寄存器作为中间桥梁MOV指令不允许直接进行部分数据传送直接传不行间接传寄存器作中间桥梁从刚刚的例子中,同学们可以看到,寄存器的功能非常强大,它可以跟任何其他空间进行数据传送,因此,我们就选寄存器作为数据传输的中间通道寄存器可跟任何其他空间进行数据传送功能强大数据传输中间通道比如说MOV指令不支持存储器和存储器之间直接进行数据传输,存储器1存储器2不支持二者之间直接进行数据传输MOV我们可以把一个存储器的内容先传送到ax中,再把ax的内容传送到另一个存储器中,这样就可以实现两个存储器之间的数据传送不能传送时的解决办法——用AX做桥梁存储器←存储器:MOVAX,MEM1MOVMEM2,AX段寄存器←段寄存器:MOVAX,DSMOVES,AX段寄存器←立即数:MOVAX,DATAMOVDS,AXMOVAX,MEM1MOVMEM2,AX存储器1AX存储器2实现2个存储器数据传送微机原理及应用第2讲数据传送指令之堆栈和堆栈指针下面我们来学习数据传输指令中的堆栈指令数据传送指令之堆栈和堆栈指针在讲解堆栈指令之前,我们先来复习一下堆栈的相关概念堆栈相关概念堆栈指令什么是堆栈?首先看一下什么是堆栈堆栈是我们在内存中开辟的一个比较特殊的区域,它按照先进后出的工作方式进行数据的存取,将数据存入堆栈的操作叫做压栈,数据从堆栈中取出来的操作叫做弹出堆栈内存中特殊区域数据存入操作压栈数据取出操作弹出按先进后出方式进行数据存取那么为什么要设置堆栈?为什么设置堆栈?堆栈为什么要按照先进后出的方式工作呢?堆栈为什么按先进后出方式工作?主要是在很多情况下,程序需要临时存储一些信息,在完成了程序以后,又需要按照相反的次序来恢复这些信息程序存储信息完成程序后按相反次序恢复信息IP我们知道,IP中存储了程序下一条将要执行的指令的偏移地址,通常情况下,IP值会自动修改以调整程序的走向,存储程序下一条执行的指令偏移地址;IP值自动修改以调整程序走向。但是,在主程序调用子程序的情况下,会比较特殊主程序调子程序主程序IP转子程序压栈执行子程序弹出返回主程序IP(下)继续执行主程序特殊主程序调用子程序的意思,就是主程序走着走着停下来,跑去执行另一个程序就是子程序,等子程序执行完以后,再回到刚刚停止的地方,继续执行。主程序调子程序主程序IP转子程序压栈执行子程序弹出返回主程序IP(下)继续执行主程序在这种情况下ip有两个值,一个是子程序起始指令的偏移地址,另一个是主程序下一条指令的偏移地址。主程序调子程序主程序IP转子程序压栈执行子程序弹出返回主程序IP(下)继续执行主程序子程序起始指令偏移地址主程序下一条指令偏移地址在ip被修改为子程序起始指令的偏移地址之前,必须将主程序下一条指令的偏移基址记录在某个地方。ip被修改之前,会将主程序下一条指令的偏移基址记录在某个地方主程序调子程序主程序IP转子程序压栈执行子程序弹出返回主程序IP(下)继续执行主程序等程序返回的时候,再把这个值告诉IP,这就是堆栈的作用,它可以用来暂存数据,等有需要的时候,再从堆栈中把这个数据取出来。主程序调子程序主程序IP转子程序压栈执行子程序弹出返回主程序IP(下)继续执行主程序堆栈作用暂存数据如需再取所以,主程序在调用子程序之前,先将主程序下一条指令的IP值压入到堆栈中,然后修改IP值为子程序的起始地址,去执行子程序主程序调子程序主程序IP转子程序压栈执行子程序弹出返回主程序IP(下)继续执行主程序调用子程序之前堆栈段栈底栈顶IPSS修改IP值为子程序的起始地址当子程序执行完毕,再从堆栈中弹出主程序下一条指令的地址给IP,继续执行主程序主程序调子程序主程序IP转子程序压栈执行子程序弹出返回主程序IP(下)继续执行主程序堆栈段栈底栈顶IPSS那堆栈为什么是先进后出呢?堆栈为什么先进后出?我们来看另一个例子,这次,主程序要调用两个子程序,而且这两个子程序是嵌套的,也就是子程序二是由子程序一调用的。子程序一是由主程序调用的子程序嵌套示意图主程序IPIP1转子程序1返回主程序IP’执行子程序2返回子程序1IP’1执行子程序1继续执行子程序1压栈弹出继续执行主程序子程序嵌套示意图堆栈段栈底栈顶SSIP1IP’1主程序IP转子程序1压栈执行子程序2弹出返回主程序IP1继续执行主程序执行子程序1IP´IP´1返回子程序1继续执行子程序1主程序调用2个子程序子程序2由子程序1调用2个子程序嵌套子程序1由主程序1调用根据我们刚才的讨论,这个时候有两个程序的断点需要被记录,一个是主程序的下一条指令的地址叫IP1,堆栈段栈底栈顶SSIP1IP’12个程序断点需记录主程序下一条指令地址:IP1子程序嵌套示意图主程序IP转子程序1压栈执行子程序2弹出返回主程序继续执行主程序执行子程序1IP´IP´1返回子程序1继续执行子程序1IP1IP1子程序嵌套示意图主程序IP转子程序1压栈执行子程序2弹出返回主程序继续执行主程序执行子程序1IP´IP´1返回子程序1继续执行子程序1IP1当主程序调用子程序的时候,IP1被压入到堆栈中堆栈段栈底栈顶IP1SSIP´1主程序调用子程序当子程序1执行到IP一撇的时候,它要去调用子程序2,此时,它要再记录一下,子程序1下一条要执行的指令的地址IP’1,然后把他再压入到堆栈中堆栈段栈底栈顶IP1SSIP´1子程序嵌套示意图主程序IP转子程序1压栈执行子程序2弹出返回主程序IP1继续执行主程序执行子程序1IP´IP´1返回子程序1继续执行子程序1记录压入堆栈再去执行子程序二,当子程序二执行完毕,我们要从堆栈中弹出IP’1,告诉IP子程序一的下一条指令的地址堆栈段栈底栈顶IP1SSIP´1子程序嵌套示意图主程序IP转子程序1压栈执行子程序2弹出返回主程序IP1继续执行主程序执行子程序1IP´IP´1返回子程序1继续执行子程序1IP子程序1下一条指令地址当子程序1执行完以后,我们要从堆栈中再弹出IP1,告诉IP,主程序的下一条指令的地址,堆栈段栈底栈顶IP1SS子程序嵌套示意图主程序IP转子程序1压栈执行子程序2弹出返回主程序IP1继续执行主程序执行子程序1IP´IP´1返回子程序1继续执行子程序1告知主程序下一条指令地址好继续执行主程序,你看这个流程就是先进入堆栈的内容,最后从堆栈中弹出,而后进入堆栈的内容要先从堆栈中弹出,堆栈段栈底栈顶SS子程序嵌套示意图主程序IP转子程序1压栈执行子程序2弹出返回主程序IP1继续执行主程序执行子程序1IP´IP´1返回子程序1继续执行子程序1先进入堆栈再弹出后进入堆栈先从堆栈弹出因此,堆栈是一个比较特殊的区域,它的运行方式是先进后出,主要的功能是临时存储程序中的一些信息,或保护一些信息不被修改堆栈段栈底栈顶SS堆栈是特殊区域先进后出临时存储信息保护信息进栈方向退栈方向堆栈段栈底栈顶SSSP在堆栈中,SS是它的段基址,sp是堆栈的指针,它始终指向堆栈的栈顶,也就是指向堆栈中最新进入堆栈的数据,sp向ss的方向移动的时候叫进栈,sp向栈底的方向移动的时候叫退栈SPSS堆栈段进栈方向退栈方向栈底栈顶SS段基址SP堆栈指针指向堆栈中最新进入堆栈的数据进栈退栈栈顶退栈进栈方向退栈方向堆栈段栈底栈顶SSSPsp的初值位于栈底,表示堆栈是空的,它的初值就规定了堆栈的大小,栈底就是堆栈中最高地址的位置sp初值SP堆栈空堆栈大小堆栈中最高地址位置进栈方向退栈方向堆栈段栈底栈顶SSSP堆栈的存储是以字为单位进行的,也就是每一次有数据进来的时候一定是一个字,会占用两个存储空间,每次数据从堆栈中取出的时候也是字,会空出两个存储空间,以字为单位一个字,占用两个存储空间取出是字,空出两个存储空间进栈方向退栈方向堆栈段栈底栈顶SSSP第二个,堆栈是先从高地址的空间开始存放,第三,堆栈只能和寄存器和存储器进行操作,不能跟立即数进行操作堆栈先从高地址空间存放堆栈寄存器存储器操作不能跟立即数操作微机原理及应用第3讲数据传送指令之堆栈指令和扩展指令数据传送指令之堆栈指令和扩展指令堆栈指令包括压栈指令,和弹出指令压栈指令堆栈指令弹出指令首先我们来看压栈指令,压栈指令的操作码是push,它的含义就是向堆栈中压入数据操作码压栈指令push向堆栈中压入数据我们知道,在堆栈中进行数据操作,都是按照字来进行的,压栈指令堆栈中数据操作按字进行所以,压栈指令就是将一个16位的数压入到堆栈中,这个16位的数是源操作数,它可以是寄存器,也可以是段寄存器,当然也可以是存储单元,而且一定是两个连续的存储单元压栈指令16位的数压入堆栈16位的数源操作数寄存器段寄存器存储单元2个举个例子pushax,这条指令的含义是将ax内容压入到堆栈中pushax将ax内容压入堆栈我们来详细的分解一下压入的过程,首先,将sp的值减1,将ax的高字节存入到sp-1所指向的存储单元,然后将sp再减1,就是在原来sp的基础上减2,然后将AX的低字节存入到sp-2指向的这个单元中,最后更新sp的内容为sp-2010203sp值-1将ax高字节存入sp-1所指存储单元将ax内容压入堆栈sp值-2将ax低字节存入sp-2所指的单元更新sp内容为sp-2这张图给出了一个具体的例子,假设AX的内容是1020hPUSH AX;将AX内容压栈低地址存储区(SS段)执行前[SP]-2[SP]高地址[SP]-1进栈方向低地址存储区(SS段)执行后[SP]高地址10H20H[AL][AH]设[AX]=1020H低地址[SP]存储区(SS段)[SP]-1[SP]-2执行前高地址低地址[SP]存储区(SS段)执行后高地址10h20h[AL][AH]进栈方向假设AX内容是1020h那么在执行pushax这条指令之前,sp指向的是这个蓝色的单元,低地址[SP]存储区(SS段)[SP]-1[SP]-2执行前高地址低地址[SP]存储区(SS段)执行后高地址10h20h[AL][AH]进栈方向假设AX内容是1020hpushax[SP]执行前在执行这条指令的时候,首先,在sp减一指向的这个位置会存入AX的高字节的内容就是10h,低地址[SP]存储区(SS段)[SP]-1[SP]-2执行前高地址低地址[SP]存储区(SS段)执行后高地址20h[AL][AH]进栈方向假设AX内容是1020hpushax执行时[SP]-110h然后,在sp-2的这个位置会存入AX的低字节的内容,就是20h,低地址[SP]存储区(SS段)[SP]-1[SP]-2执行前高地址低地址[SP]存储区(SS段)执行后高地址20h[AL][AH]进栈方向假设AX内容是1020hpushax执行时10h[SP]-2执行完以后,sp指向的是20h这个单元低地址[SP]存储区(SS段)[SP]-1[SP]-2执行前高地址低地址[SP]存储区(SS段)执行后高地址20h[AL][AH]进栈方向假设AX内容是1020hpushax10h[SP]执行后下面再来看一下弹出指令,压栈指令堆栈指令弹出指令弹出指令的操作码是popPOPDest操作码弹出指令POP它的功能是从堆栈中将数据取出来,传送到目的操作数中,从堆栈中取出数据POPDestPOP传送到目的操作数弹出指令所以,pop后面的这个操作数是目的操作数,POPDestDest弹出指令目的操作数同样的,弹出操作的对象也是16位的数,POPDestDest弹出指令操作对象是16位的数所以目的操作数必须是能够存储16位数据的空间,这个空间可以是寄存器,段寄存器,也可以是两个连续的内存单元目的操作数有存储16位数据空间寄存器段寄存器内存单元两个连续POPDestDest弹出指令我们来看一个例子,比如popbx,它是将堆栈中栈顶的内容弹出到bx中,popbx将栈顶内容弹出到bx操作的过程是,首先,将sp指向的堆栈单元的内容存入到bl中,然后,将sp+1指向的堆栈单元的内容存入到bh中,最后将sp的内容更改为sp加201将sp指向堆栈单元内容存入bl将栈顶内容弹出到bx02将sp+1指向堆栈单元内容存入bh03将sp内容更改为sp+2我们结合这个图示再理解一下,现在sp指向的堆栈单元中存储的是20h,低地址[SP]+2存储区(SS段)[SP]+1[SP]执行前高地址低地址[SP]存储区(SS段)执行后高地址[BL][BH]出栈方向10h20h低地址存储区(SS段)执行前[SP][SP]+2高地址[SP]+110H20H出栈方向低地址存储区(SS段)执行后[SP]高地址[BL][BH][SP]他的下一个单元存储的是10h,低地址[SP]+2存储区(SS段)[SP]+1[SP]执行前高地址低地址[SP]存储区(SS段)执行后高地址[BL][BH]出栈方向10h20h低地址存储区(SS段)执行前[SP][SP]+2高地址[SP]+110H20H出栈方向低地址存储区(SS段)执行后[SP]高地址[BL][BH][SP]+1在执行popbx的时候,首先,将sp指向堆栈单元的内容20h存储到bl中,低地址[SP]+2存储区(SS段)[SP]+1[SP]执行前高地址低地址[SP]存储区(SS段)执行后高地址[BL][BH]出栈方向10h20h低地址存储区(SS段)执行前[SP][SP]+2高地址[SP]+110H20H出栈方向低地址存储区(SS段)执行后[SP]高地址[BL][BH]popbx[SP][BL]然后将sp加一指向的堆栈单元的内容存入到bh中,最后sp的值修改为sp+2,所以,这条指令执行完以后,BX的内容是1020h低地址[SP]+2存储区(SS段)[SP]+1[SP]执行前高地址低地址[SP]存储区(SS段)执行后高地址[BH]出栈方向10h20h低地址存储区(SS段)执行前[SP][SP]+2高地址[SP]+110H20H出栈方向低地址存储区(SS段)执行后[SP]高地址[BL][BH]popbx[SP]+1[BH][BL][SP]+2执行后bx1020h好,我们再来总结一下弹出指令的使用规则压栈指令堆栈指令弹出指令使用规则首先,它是按字来进行操作的,其次,不能把栈顶的内容弹出到CS这个段寄存器中,但是可以使用push指令将CS的值存入到堆栈中,这个是没有问题的,使用规则堆栈操作总是按字进行不能从栈顶弹出一个字给CS堆栈指针为SS:SP,SP永远指向栈顶SP自动进行增减量(-2,+2)弹出指令使用规则按字操作不能把栈顶内容弹出到CS段寄存器可使用push指令将CS值存入堆栈还有就是,堆栈指令的逻辑地址是ss冒号sp,堆栈指令弹出指令逻辑地址SS:SPss它的段基址,sp是他的段内偏移量,sp指向堆栈的栈顶,弹出指令段基址堆栈指令逻辑地址SS:SPSS段内偏移量SP堆栈栈顶每次执行push或者pop指令的时候,sp会自动的进行减二或者是加二的处理,弹出指令堆栈指令逻辑地址SS:SPpushpopSP自动-2自动+2最后我们来看一下扩展指令,扩展指令是一个隐含寻址的指令,扩展指令隐含寻址它的指令格式就是cbw或者cwd,后面没有操作数,隐含寻址用于有符号数的除法若[AL]=A7H,则执行CBW后,AH的内容为FFHCBW;把AL的符号位复制到AHCWD;把AX的符号位复制到DX扩展指令cbwcwd后无操作数cbw的意思是将byte扩展成word,就是将字节扩展成字,这里被隐含的操作数是al,隐含寻址用于有符号数的除法若[AL]=A7H,则执行CBW后,AH的内容为FFHCBW;把AL的符号位复制到AHCWD;把AX的符号位复制到DX扩展指令byte扩展成word字节扩展成字cbwalcbw是将al的符号位扩展到ah中,构成ax这个字隐含寻址用于有符号数的除法若[AL]=A7H,则执行CBW后,AH的内容为FFHCBW;把AL的符号位复制到AHCWD;把AX的符号位复制到DX扩展指令al符号位扩展到ah构成axcbw再来看一下cwd,cwd的意思是将word扩展成doubleword,也就是把字扩展成双字,这里被隐含的操作数是ax,扩展指令cwdword扩展成doubleword字扩展成双字axcwd将ax的符号位扩展到了dx中,最后得到的是DX和AX构成的双字扩展指令cwdax符号位扩展到dxDX和AX构成双字扩展指令主要用于有符号数的除法,因为在计算除法的时候要求被除数一定是除数的两倍字长,所以在做除法之前,可能需要将被除数进行符号位的扩展,有符号数除法计算除法时被除数是除数2倍字长扩展指令除法前将被除数符号位扩展举个例子,比如AL的内容是A7h,当指令CBW被执行以后,AL的符号位1被扩展到AH中,ah的内容就变成了ffh执行指令CBW后[AL]=A7h隐含寻址用于有符号数的除法若[AL]=A7H,则执行CBW后,AH的内容为FFHAL符号位1扩展到AHAH内容为ffh扩展指令微机原理及应用第4讲数据传送指令之输入输出指令下面我们来学习输入输出指令数据传送指令之输入输出指令输入输出指令是CPU跟io端口进行数据传送在计算机中,可能有很多个IO接口在每个IO接口中,又会有多个IO端口,它们用于存储数据的寄存器可以直接被CPU访问CPU就是通过输入输出指令与IO端口之间传送信息CPU输入输出指令IO端口数据传送输入输出指令是CPU跟io端口进行数据传送,在计算机中,可能有很多个IO接口,在每个IO接口中,又会有多个IO端口,输入输出指令IO接口IO端口它们用于存储数据的寄存器可以直接被CPU访问,CPU就是通过输入输出指令与IO端口之间传送信息输入输出指令IO接口IO端口寄存器可以直接被CPU访问CPU通过输入输出指令与IO端口传送信息将输出数据存到AL或AX中输入输出指令有一些使用规则,首先,只能用累加器AL或者AX来传输信息,也就是说将你想要输出给端口的数据事先存到AL或AX中,才能输出出去,而从端口中读入的数据也只能读入到Al或ax中,其他寄存器不能进行跟端口进行数据传送使用规则只能用累加器AL或AX来传输信息将读入数据读到AL或AX中另外,输入输出指令支持两种寻址方式,一种是直接寻址,将立即数写入到指令中,作为端口的地址,这种寻址方式支持的端口号是00~ffh,如果端口号超过了这个范围,输入输出指令端口号:00H~FFH直接寻址方式(立即数)还可以用寄存器间接寻址方式,寄存器间接寻址就是用dx这个寄存器存放端口号,它支持的端口号是0000h~ffffh,输入输出指令端口号:00H~FFH直接寻址方式(立即数)端口号:0000H~FFFFH寄存器间接寻址方式(DX)使用寄存器间接寻址
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027年备考执业药师之西药学专业二过关测验试题高频卷附答案
- 2027年备考公用设备工程师之专业基础知识(暖通空调+动力)提升训练试题高频卷附答案
- 2027年备考中级经济师之中级经济师金融专业考前冲刺试题(备用卷)含答案
- 2025-2026学年山东省诸城市初中生物七年级期末下册自测高分特训题(详细参考解析)
- 2025-2026学年广东省佛山市初中历史九年级期末上册通关全真模拟题(详细参考解析)
- 2025-2026学年吉林省和龙市初中数学七年级期末上册评估能力提升卷(详细参考解析)
- 2026学年内蒙古自治区乌兰浩特市一年级数学期末高分预测高频题附答案详细答案和解析
- 2025-2026学年广西壮族自治区百色市初中生物八年级期末下册自测高频题(附答案)
- 2026年内蒙古图书馆文秘招聘考试练习试卷(含答案)
- 2026年广西东兴博物馆招聘考试练习试卷(含答案)
- GB/T 34542.5-2026氢气储存输送系统第5部分:氢气输送系统技术要求
- 自动扶梯吊装作业专项方案
- 高三思想政治一轮复习《世界是永恒发展的》教学设计
- 2026学年广州市中考语文一模试卷(学生版)
- 广东省深圳市南山区2023~2024学年七年级上学期期中历史试题(含答案)
- 理想L7 2026款改款车主手册说明书
- 2026秋新人教版英语六年级上册教学课件:单元四unit4A
- WS+271-2026+感染性腹泻诊断标准
- 码头建设项目社会稳定风险评估报告
- 加气站安全管理内容培训课件
- 西藏导游证考试地方导游基础知识题库含答案
评论
0/150
提交评论