您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 计算机组成原理与语言程序设计第4章4研究
80x86CPU指令按操作数地址个数可划分为3种类型:(1)双操作数指令OPRDEST,SRCOPR表示指令操作码。指令中给出两个操作数地址,SRC表示源操作数地址,简称源地址;DEST表示目的操作数地址,简称目的地址。(2)单操作数指令OPRDEST指令中只给出一个操作数地址DEST。若指令只需一个操作数,则该地址既是源地址又是目的地址。若指令需两个操作数,则另一个操作数地址由指令隐含指定。(3)无操作数指令OPR一种情况是指令未给出操作数地址,但隐含指定了操作数的存放处。另一种情况是指令本身不需要操作数。4.3.280x86CPU指令系统80x86指令按功能可分为6大类:(1)传送类指令(TransferInstructions)(2)算术运算类指令(ArithmeticInstructions)(3)逻辑类指令(BitManipulationInstructions)(4)串操作类指令(StringInstructions)(5)程序转移类指令(ProgramTransferInstructions)(6)处理器控制类指令(ProcessorControlInstruction)下面分别介绍这几类指令(其中的第5类指令将在第5章介绍),下述指令均采用汇编指令格式描述。1.传送类指令传送类指令负责把数据、地址或立即数传送到寄存器或存储单元中。它又可分为4种:数据传送指令、地址传送指令、标志位传送指令和类型转换指令。(1)数据传送指令MOV(MOVe)传送PUSH(PUSHontothestack)进栈POP(POPfromthestack)出栈XCHG(eXCHanGe)交换①MOV传送指令指令格式:MOVDEST,SRC指令功能:DEST(SRC),即将源地址的内容(源操作数)传送到目的地址中。传送指令执行完后源操作数保持不变。受影响的状态标志位:无。MOV指令中的两个操作数可以同时是字节、字或双字,但两者位数必须一致。源操作数可存放在通用寄存器、段寄存器、存储器中,也可以是立即数;目的操作数则不能为立即数;并且两个操作数不能同时为存储器操作数。MOV指令的数据传送方向如右图所示:例如,将立即数传送到通用寄存器或存储单元MOVAL,1FH;将8位立即数1FH传送到8位寄存器AL中MOVAX,2345H;字传送MOVDA_BYTE,0FEH;字节传送MOVARY[BX],1234H;字传送例如,寄存器之间的传送MOVAH,BL;字节传送MOVDX,CX;字传送MOVDS,AX;字传送例如,寄存器与存储单元之间的传送MOVCL,DA_BYTE;字节传送MOVTAB[BX][DI],AX;字传送【例4-6】把DA_WORD1字单元内容传送到DA_WORD2字单元中,可用如下两条指令:MOVAX,DA_WORD1MOVDA_WORD2,AX此外,MOV指令中立即数不能直接传送给段寄存器,而且段寄存器之间也不能直接传送数据,但可以通过通用寄存器来实现间接传送。【例4-7】把立即数10A0H传送给段寄存器DS、ES,可用以下3条指令:MOVAX,10A0HMOVDS,AXMOVES,AX④PUSH进栈指令指令格式:PUSHSRC指令功能:首先修改堆栈指针SP或ESP的内容,然后将源操作数压入栈顶单元中。源操作数可以是立即数、寄存器(含段寄存器)或存储单元的内容,但8086不能使用立即数。具体操作可表示如下:操作数16位:SP或ESP(SP或ESP)2栈顶字单元(SRC)受影响的状态标志位:无。堆栈是以“后进先出”方式工作的一个存储区,它必须存在于堆栈段中,因而其段基值或段选择器存放于SS寄存器中。堆栈操作只能在栈顶进行,因此使用堆栈指针SP或ESP来指示栈顶单元的地址,当堆栈地址长度为16位时用SP,当堆栈地址长度为32位时用ESP。应当注意,堆栈的存取必须以字或双字为单位。⑤POP出栈指令指令格式:POPDEST指令功能:首先将SP或ESP指向的栈顶单元的内容弹出到目的寄存器或存储单元中,然后修改SP或ESP指向栈顶。目的地址可采用寄存器(除CS外)或存储器寻址方式,但不能是立即寻址。具体操作可表示如下:操作数16位:DEST栈顶字单元内容SP或ESP(SP或ESP)+2受影响的状态标志位:无。操作数长度(位)地址长度(位)执行的操作1616SP(SP)2字出栈或进栈1632ESP(ESP)2字出栈或进栈3216SP(SP)4双字出栈或进栈3232ESP(ESP)4双字出栈或进栈PUSH/POP指令执行的操作PUSH和POP指令的操作数地址长度为16位时,使用SP作为堆栈指针,进出栈的可以是字,也可以是双字;同样地,地址长度为32位时,使用ESP作为堆栈指针,进出栈的可以是双字,也可以是字。如下表所示。【例4-12】指令“PUSHAX”的执行情况如下图所示:【例4-13】指令“POPAX”的执行情况如图所示:⑧XCHG交换指令指令格式:XCHGDEST,SRC指令功能:(DEST)(SRC)。将源地址的内容与目的地址的内容相互交换。数据交换只能在通用寄存器之间或通用寄存器与存储单元之间进行,不允许使用段寄存器。指令允许字或字节操作,80386及其后继机型还允许双字操作。受影响的状态标志位:无。源操作数的物理地址=2F000+0200+0046=2F246则该指令执行后(BX)=4154H,(2F246H)=6F30H【例4-22】指令“XCHGBX,[BP+SI]”执行前,设(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H(2)地址传送指令这种指令完成将存储器操作数的地址传送给指定的寄存器,而不是传送操作数。LEA(LoadEffectiveAddress)有效地址送寄存器。LDS(LoadDSwithpointer)地址指针送寄存器和DS。LES(LoadESwithpointer)地址指针送寄存器和ES。LFS(LoadFSwithpointer)地址指针送寄存器和FS。LGS(LoadGSwithpointer)地址指针送寄存器和GS。LSS(LoadSSwithpointer)地址指针送寄存器和SS。①LEA有效地址送寄存器指令指令格式:LEADEST,SRC指令功能:DESTSRC的EA,即将源操作数的有效地址EA传送到目的地址(16位或32位通用寄存器)中。受影响的状态标志位:无。LEA指令的源操作数必须是存储器操作数,而目的地址只能是16位或32位通用寄存器名,不能使用段寄存器。目的寄存器位数源操作数地址长度执行的操作1616计算得16位有效地址,存入16位目的寄存器1632计算得32位有效地址,截取低16位存入16位目的寄存器3216计算得16位有效地址,零扩展后存入32位目的寄存器3232计算得32位有效地址,存入32位目的寄存器由于存在着目的寄存器位数与源操作数有效地址长度的不同,该指令执行的操作如下表所示:如下图所示,设指令“LEASI,BUF”中BUF的有效地址EA是100H,因此该指令完成将100H送入SI中,而不是把DS:100H所指向字单元的内容00FFH送入SI中。LEASI,BUF指令的执行情况②LDS、LES地址指针送寄存器和段寄存器指令在前面曾介绍,一个存储单元的逻辑地址是由16位段基值(或段选择器)和16(或32)位偏移地址组成。因此,可用4(或6)个字节单元来存放这个逻辑地址。这4(或6)个字节单元构成32(或48)位的地址指针,段基值(或段选择器)存放在2个高字节单元中,偏移地址则存放在2(或4)个低字节单元中。32位的地址指针如右图所示:指令LDS的功能就是从作为地址指针的4(或6)个存储单元中,同时取出段基值(或段选择器)与偏移地址,分别送到段寄存器DS和指定通用寄存器中。LDS指令格式:LDSDEST,SRCLES、LFS、LGS、LSS指令与其格式相同,只是指定的段寄存器不同。LDS指令功能:DEST(SRC)DS(SRC+2)或DS(SRC+4)受影响的状态标志位:无。【例4-14】右图给出了指令“LDSSI,ADR[BX]”的执行情况。由源地址ADR[BX]可以计算出源操作数在数据段的有效地址EA。这时EA及EA+2指向的字单元作为32位地址指针。EA指向的字单元存放的是偏移地址,应送到指令指定的SI中;EA+2字单元存放的是段基值,应送到DS中。该指令执行完后,DS的内容为新的段基值。LDSSI,ADR[BX]指令功能在实模式下,假设(DS)=091DH,(SS)=1E4AH,(AX)=1234H,(BX)=0024H,(CX)=5678H,(BP)=0024H,(SI)=0012H,(DI)=0032H,(09226H)=00F6H,(09228H)=1E40H,(1E4F6H)=091DH。试给出以下指令的执行结果。(1)MOV[BP][DI],CX(2)LDSSI,[BX][DI](3)标志位传送指令这种指令用于对标志寄存器进行存取操作,共有6条指令且都是无操作数指令。LAHF(LoadAHwithFlags)标志送AH。SAHF(StoreAHintoFlags)AH送标志寄存器。PUSHF/PUSHFD(PUSHtheFlagsoreflags)标志进栈。POPF/POPFD(POPtheFlagsoreflags)标志出栈。【例4-25】指令“LDSSI,[10H]”执行前,如果(DS)C000H,(C0010H)0180H,(C0012H)=2000H。则指令执行后:(SI)0180H,(DS)=2000H。①LAHF标志送AH指令指令格式:LAHF指令功能:AHFLAGS的低字节,即将标志寄存器的低8位内容传送到AH寄存器中,也就是把标志位SF、ZF、AF、PF、CF送至AH中的第7,6,4,2,0位。受影响的状态标志位:无。②SAHFAH送标志寄存器指令指令格式:SAHF指令功能:FLAGS的低字节(AH),即将AH寄存器的内容传送给标志寄存器的低8位。受影响的状态标志位:SF、ZF、AF、PF、CF。SAHF指令用以设置或恢复SF、ZF、AF、PF、CF5个标志位。它只影响标志寄存器的低8位,对高8位标志无影响。③PUSHF/PUSHFD标志进栈指令指令格式:PUSHF指令功能:PUSHF:①SP(SP)2。②栈顶字单元(FLAGS),不影响任何状态标志位。④POPF/POPFD标志出栈指令指令格式:POPF指令功能:POPF:①FLAGS栈顶字单元内容。②SP(SP)+2。这组指令中的LAHF和PUSHF/PUSHFD不影响标志位。SAHF和POPF/POPFD则由装入的值来确定标志位的值,但POPFD指令不影响VM、RF、IOPL、VIF和VIP的值。(4)类型转换指令这种指令可将字节、字转换为字、双字,共有4条指令且都是无操作数指令。CBW(ConvertBytetoWord)字节转换为字。CWD/CWDE(ConvertWordtoDoubleWord)字转换为双字。这组指令均不影响标志位。①CBW字节转换为字指令指令格式:CBW指令功能:扩展AL的符号到AH,形成AX中的字。即如果(AL)的最高有效位为0,则(AH)0;如果(AL)的最高有效位为1,则(AH)0FFH。②CWD字转换为双字指令指令格式:CWD指令功能:扩展AX的符号到DX,形成DX:AX中的双字。即如果(AX)的最高有效位为0,则(DX)0;如果(AX)的最高有效位为1,则(DX)0FFFFH。人有了知识,就会具备各种分析能力,明辨是非的能力。所以我们要勤恳读书,广泛阅读,古人说“书中自有黄金屋。”通过阅读科技书籍,我们能丰富知识,培养逻辑思维能力;通过阅读文学作品,我们能提高文学鉴赏水平,培养文学情趣;通过阅读报刊,我们能增长见识,扩大自己的知识面。有许多书籍还能培养我们的道德情操,给我们巨大的精神力量,鼓舞我们前进。
本文标题:计算机组成原理与语言程序设计第4章4研究
链接地址:https://www.777doc.com/doc-3200810 .html