• 424.00 KB
  • 2022-06-17 16:02:10 发布

秦皇岛市中考满分作文-第4章80X86指令系统

  • 48页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
4.1寻址方式寻址方式是指CPU在执行指令时寻找操作数的方式。8086指令中涉及的操作数(源)主要有四种:立即操作数、寄存器操作数、存储器操作数和I/O端口操作数。1立即寻址5寄存器相对寻址2寄存器寻址6基址加变址寻址3直接地址7相对的基址加变址寻址4间接地址8I/O端口寻址一条指令由两部分组成:操作码部分:规定指令执行什么样的操作;操作数部分:是指令的操作对象,无操作数、单操作数、双操作数。第4章8086/8088指令系统 1立即寻址(ImmediateAddressing)操作数直接放在指令中,作为指令的一部分存放在代码段里,可以是8位、16位,也叫立即数,用于给寄存器赋初值。如:MOVAX,1234H2寄存器寻址(RegisterAddressing)操作数包含在CPU的内部寄存器中,由指令指定寄存器的名称。如:MOVDS,AX注意:源操作数的长度必须与目的操作数的一致。3直接寻址(DirestAddressing)操作数所在存储单元地址的16位偏移量(有效地址EA)直接包含在指令中,操作数默认存放在数据段中,允许段超越。如:MOVAX,[2000H];DS×16+2000HMOVBX,ES:[2000H];ES×16+2000H 4寄存器间接寻址(RegisterIndirectAddressing)指令里给出的寄存器中的值不是操作数本身,而是操作数的有效地址EA。SI、DI、BX(默认操作数在数据段中):MOVAX,[BX]BP(默认操作数在堆栈段中):MOVAX,[BP]5寄存器相对寻址(RegisterRelativeAddressing)操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和。如MOVBX,COUNT[BX];DS=3000H,BX=2000H,COUNT=3000H3000H×16+2000H+30000H=35000H6基址变址寻址方式(BasedIndexedAddressing)操作数的有效地址是一个基址寄存器(BP、BX)和一个变址寄存器(SI、DI)的内容之和,两个寄存器均由指令指定。如MOVAX,[BX+SI] 7相对基址变址寻址方式(RelativeBasedIndexedAddressing)操作数的有效地址是一个基址寄存器(BP、BX)和一个变址寄存器(SI、DI)的内容之和,再加上指令中指定的8位或16位位移量.如MOVAX,200H[BX+SI]注:以上四种寻址方式都允许段超越。8I/O端口寻址通过直接和间接的方式来进行操作数的寻址。直接寻址:能够寻址的端口号在0~255的范围内,即能够寻址256个端口。例如:INAL,60H;60H端口中的内容送至AL间接寻址:必须通过DX间接寻址,这种方式能够寻址的端口号范围为0~65535,共计64K个端口。例如:MOVDX,0360H;0360H端口中的内容送至ALINAL,DX 注:有关方括号的地址表达,必须遵循下列规则:1)立即数可以出现在方括号内,表示直接地址。例如:[2000H]2)只有BX、BP、SI和DI可以出现在方括号以内,它们可以单独出现,可以组合或以寄存器和常数相加的形式出现,但BX和BP、SI和DI不允许出现在同一个方括号内。3)方括号有相加的含义,下面的几种写法都是等价的。6[BX+SI][BX+6][SI][BX+SI+6]4)若方括号内含有BP,则隐含使用SS提供段地址。常见形式:DISP[BP+SI]DISP[BP+DI]20PA=SS×16+EADISP[BP] 4.28086指令系统数据传送类指令算术运算类指令逻辑运算类指令串操作类指令控制转移类指令处理器控制类指令 4.2.1数据传送类指令(不影响标志)一、通用数据传送指令1MOVDST,SRC存储器寄存器立即数段寄存器注:MOV指令不能实现的数据传送:1)不能两个操作数都是存储单元2)不能用CS、IP作目的操作数3)不允许立即数作目的操作数4)不允许段寄存器间直接传送5)不能向段寄存器送立即数6)不能两个操作数一个是8位,一个是16位2PUSHSRC;入栈指令sp←sp-2(sp+1,sp)←srcPOPDST;出栈指令dest←(sp+1,sp)sp←sp+2注:1)入、出栈操作均是以字为单位2)SRC、DST:R16、SEG、M163)DST不允许是CS、IP寄存器 3XCHGDST,SRC交换指令DST←→SRC注:1允许字或字节操作2段寄存器和立即数不能做操作数3两个操作数必有一个在寄存器中4XLAT;换码指令(BX+AL)→AL(完成一字节的查表转换)注:必须事先把表的起始地址送BX,AL内容为表中的编号.二、输入输出指令INAL,nINAL,DX;从8位端口读取一个字节INAX,nINAX,DX;从16位端口读取一个字OUTn,ALOUTDX,AL;向8位端口写一个字节OUTn,AXOUTDX,AX;向16位端口写一个字说明:当端口地址号为00H~FFH,采用第一种格式,共寻址256个端口;任一端口地址都可采用第二种格式。 三、地址传送指令用途:用于传送操作数的地址(段地址或偏移地址)1取有效地址指令LEAREG16,MEM;将指定内存单元的偏移地址送到指定寄存器2地址指针装入指令LDSREG16,MEM32;DS:REG←(MEM开始的四个内存单元的内容)LESREG16,MEM32;ES:REG←(MEM开始的四个内存单元的内容)注:1)源操作数必须是一个存储器操作数;2)目的操作数必须是一个16位的通用寄存器。四、标志寄存器传送指令1LAHF;AH←FLAGS的低8位2SAHF;FLAGS的低8位←AH3PUSHF;sp←sp-2(sp+1,sp)←FLAGS4POPF;FLAGS←(sp+1,sp)sp←sp+2 4.2.2算术运算类指令一、加法指令1ADDDST,SRC;SRC+DST→DST2ADCDST,SRC;SRC+DST+CF→DST说明:1)目的操作数可以是寄存器、存储单元;源操作数可以是寄存器、存储单元及立即数;不能同时为存储单元。2)对标志位CF、OF、PF、SF、ZF、AF有影响。3INCDST;DST+1→DST(increment)说明:1)此指令完成对指定的操作数加1,然后返回此操作数;2)它影响的标志位为AF,OF,PF,SF,ZF,而对进位CF没有影响;3)该指令只有一个操作数,如果内存单元的内容增1,则程序中必须有说明该存储单元是字或字节的符号或说明语句。 例:计算56AB7809H+23905DF2H=?分析:加法要分两次进行,先进行低两个字节相加,然后再做高两个字节的相加,此时必须考虑前两个字节相加后的进位。假设被加数和加数分别存放在以DADA1和DATA2为首地址的存储区,和存放在以DATA3为首地址的存储区。MOVAX,DATA1;低16位的被加数送累加器AXADDAX,DATA2;低16位的被加数与加数相加MOVDATA3,AX;低16位相加的和送存MOVAX,DATA1+2;高16位的被加数送累加器AXADCAX,DATA2+2;高16位的被加数与加数相加MOVDATA3+2,AX;高16位相加的和送存存储器……DATA1F2H5DH…78HABH被加数数据段90H23H加数09H56HDATA2 二、减法指令1SUBDST,SRC;DST-SRC→DST同ADD2SBBDST,SRC;(Subtractwithborrow)带借位减主要用于多字节相减同ADC3DECDST;DST-1→DST(Decrement)对指定的操作数减1,操作数可以是寄存器,也可以是内存单元;影响AF.OF.PF.SF和ZF但不影响CF;同样对存储单元说明是字或字节的操作。4NEGDST;(Negate)对操作数取补,即用0减操作数,把结果送回操作数,求补指令不同于补码的求法,若DST为正数,求补后可得绝对值相等的负数(补码);若DST为负数(补码),求补可得绝对值相等的正数。5CMPDST,SRC;DST-SRC(Compare)比较指令完成两个操作数相减,使结果反映在标志位上,但并不送回结果;其后往往跟着一条转移指令,根据比较结果产生不同的程序分支。 例:存储器的数据段存放了100个带符号数,其首地址为AREA,要求将各数据取绝对值后再送存原来的存储单元。分析:由于100个带符号数中既有正数,又有负数,若为正数则不需要处理;若为负数则需用NEG指令求补,再送存,因此程序中要先判断正负。程序如下:LEASI,AREA;SI←源地址MOVCX,100;CX←循环次数CHECK:MOVAL,[SI];取一个带符号数送ALORAL,AL;AL内容不变,但影响标志位JNSNEXT;若SF=0,则转向NEXTNEGAL;否则求补MOV[SI],AL;负数求补后送回NEXT:INCSI;源地址加1DECCX;循环次数减1JNZCHECK;循环次数不为0,转向CHECKHLT;停止 三、乘法指令无符号数相乘1MULSRC;1)本指令影响CF、OF,不影响AF、PF、SF、ZF2)DST:隐含在AL或AX,SRC:是寄存器操作数或内存操作数3)字节(AL)×字节=字(AX);如果AH≠0,则CF=1,OF=1字(AX)×字=双字(DX,AX);如果DX≠0,则CF=1,OF=1例:计算21H×08H=?MOVAL,21H;AL=21HMOVBL,08H;BL=08HMULBL;AX=0108H,CF=OF=1带符号数相乘2IMULSRC;整数乘法(带符号数相乘)与MUL相似,当乘积高半部分仅仅是低半部分符号位的扩展,则CF=OF=0,否则CF=OF=1表示AH或DX中包含着乘积的有效数字,而非发生进位或溢出。例:计算带符号数05H×08H=?MOVAL,05H;AL=05HMOVBL,08H;BL=08HIMULBL;AX=0028H,CF=OF=0 四、除法指令无符号数除法指令1DIVSRC;1)若除数为零,则内部产生一个类型0中断2)AX/字节商→AL,余数→AHDX,AX/字商→AX,余数→DX3)所有的标志位无意义例:计算无符号数0410H÷B8H=?MOVAX,0410H;AX=0410HMOVBL,B8H;BL=B8HDIVBL;AL=05H,AH=78H带符号数除法指令2IDIVSRC;与DIV相似例:计算带符号数0410H÷B8H=?MOVAX,0410H;AX=0410HMOVBL,B8H;BL=B8HIDIVBL;AL=F2H,AH=20H 五、十进制调整指令专用于对BCD码运算的结果进行调整包括:AAA、DAA、AAS、DAS、AAM、AAD均为隐含寻址,隐含的操作数为AL和AH为何要对BCD码的运算结果进行调整?BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制(十六进制)进行运算,并未按十进制规则进行运算。1AAA;(UnpackedBCD[ASCII]adjustforaddition)对AL中的非压缩BCD码相加的结果进行校正,得到正确的非压缩BCD码和,AAA必须紧接在ADD、ADC指令后,只影响AF,CF。若(AL)&(0FH)>9,或(AF)=1则AL←(AL)+6,AH←(AH)+1,AF←1,CF←1,AL←((AL)&0FH)否则AL←((AL)&0FH)例:求两个十进制数的和8+9=?MOVAX,0008H;(AL)=08H,(AH)=00HMOVBL,09H;(BL)=09HADDAL,BL;(AL)=11HAAA;(AL)=07H,(AH)=01H,(CF)=(AF)=1 2DAA;(DecimalAdjustforAddition)对AL中的两个压缩的BCD码相加的结果进行校正,得到正确的压缩BCD码和,DAA必须紧接在ADD、ADC指令后,只影响AF,CF。若(AL)&(0FH)>9,或(AF)=1若(AL)>9FH,或(CF)=1则AL←(AL)+6,AF←1则AL←(AL)+60H,CF←1例:求两个十进制数的和62+57=?MOVAL,62H;(AL)=62HMOVBL,57H;(BL)=57HADDAL,BL;(AL)=B9HDAA;(AL)=19H,(CF)=13AAS;(UnpackedBCD[ASCII]adjustforsubtraction)对AL中的非压缩BCD码相减的结果进行校正,得到正确的非压缩结果,AAS必须紧接在SUB、SBB指令后,只影响AF,CF。若(AL)&(0FH)>9,或(AF)=1则AL←(AL)-6,AH←(AH)-1,AF←1,CF←1,AL←((AL)&0FH)否则AL←((AL)&0FH) 4DAS;(DecimalAdjustforSubtraction)对AL中的两个压缩的BCD码相减的结果进行校正,得到正确的压缩BCD码结果,DAA必须紧接在SBB、SUB指令后。若(AL)&(0FH)>9,或(AF)=1若(AL)>9FH,或(CF)=1则AL←(AL)-6,AF←1则AL←(AL)-60H,CF←15AAM;(UnpackedBCD[ASCII]adjustformultiply)AAM的调整操作为:AH←(AL)/0AH;AL除以10,商送AHAL←(AL)%0AH;AL除以10,余数送AL从AAM的调整操作可以看出,其实质是将AL寄存器中的二进制数转换成非压缩BCD码,十位存放在AH中,个位存放在AL中。AAM指令将根据AL中的结果改变标志位SF、ZF和PF的状态,但AF、CF和OF的值不确定。例:求两个十进制数的积8×6=?MOVAL,08H;AL=08HMOVBL,06H;BL=06HMULBL;AX=0030HAAM;AH=04H,AL=08H,SF=0,ZF=0,PF=1 6AAD;(UnpackedBCD[ASCII]adjustfordivision)指令功能:AL←(AH)×0AH+(AL)AH←0即将AH的内容乘10并加上AL的内容,结果送回AL,将0送回AH。这种操作的实质就是将AX中非压缩的BCD码转换成为二进制数,并存放在AL寄存器中。指令执行后,根据AL中的结果影响标志位SF、ZF和PF,其余标志位的值不确定。例:计算十进制除法运算85÷3=?MOVAX,0805H;AH=08H,AL=05HMOVBL,03H;BL=03HAAD;AL=55HDIVBL;AH=01H,AL=1CHAAM;AH=02H,AL=08H六、符号扩展指令1CBW;(ConvertBytetoWord)AL符号扩展到AH2CWD;(ConvertWordtoDoubleWord)AX符号扩展到DX最高位为1,扩展全1;最高位为0,扩展全0。 4.3.3位操作指令一、逻辑运算指令1NOTDST;对源操作数求反,然后回送源操作数2ANDDST,SRC;按位逻辑与,结果回送到目的操作数3ORDST,SRC;按位逻辑或,结果回送到目的操作数4XORDST,SRC;对指令的操作数进行“异或”运算5TESTDST,SRC;本指令完成AND同样的操作.但并不回送结果,类似CMP其他指令置CF、OF为0,AF不定(无意义)SF、ZF、PF据结果置位说明:SRC:REG/MEM/DATA,DST:REG/MEM除NOT指令单操作数外,其它均为双操作数可进行字节或字操作NOT指令不影响标志TEST只影响标志位,不影响操作数。 例:数字0~9的ASCII码连续存放在存储器中,其首地址为DATA1,编写程序将其转换成相应的非压缩BCD码,并存放在以DATA2为首地址的存储区域。分析:0~9的ASCII码为30H~39H,因此只要屏蔽掉ASCII码的高4位即可实现转换。LEASI,DATA1;SI←源地址LEADI,DATA2;DI←目的地址MOVCX,10;CX←循环次数NEXT:MOVAL,[SI];取一个数字的ASCII码送ALANDAL,0FH;屏蔽AL的高4位MOV[DI],AL;非压缩BCD码送存INCSI;源地址加1INCDI;目标地址加1DECCX;循环次数减1JNZNEXT;循环次数不为0,转向NEXTHLT;停止 SHLDST,1CLSALDST,1CLSHRDST,1CLSARDST,1CL0CF0CFCF0CF执行操作指令格式二、移位指令SHL(ShiftLogicLeft)逻辑左移指令SAL(ShiftArithmeticLeft)算术左移指令SHR(ShiftLogicRight)逻辑右移指令SAR(ShiftArithmeticRight)算术右移指令当移位次数为1时,如果移位后的最高位的值被改变,则OF=1 三、循环移位指令ROL(RotateLeft)循环左移指令ROR(RotateRight)循环右移指令RCL(RotatethroughCFLeft)带进位循环左移指令RCR(RotatethroughCFRight)带进位循环右移指令指令格式执行操作CFCFCFCFROLDST,1CLRORDST,1CLRCLDST,1CLRCRDST,1CL当移位次数为1时,如果移位后的最高位的值被改变,则OF=1 对于移位指令,有以下几点需要说明:1)DST:REG/MEM2)若只移位1次,可使指令中的计数值设为1;若移位次数大于1,则将移位次数送进CL寄存器,再将CL放在指令的计数值中。3)左移相当于乘2,右移相当于除2;SAL、SAR用于带符号数,SHL、SHR用于无符号数。4)当移位次数为1时,如果移位后的最高位的值被改变,则OF=1 例:假设AL=1,下列指令执行后,AL寄存器的内容是什么?SALAL,1;AL=2MOVBL,AL;BL=2SALAL,1;AL=4SALAL,1;AL=8ADDAL,BL;AL=10例:统计一个16位存储器操作数中“1”的个数,假设存储器操作数的地址为DATA,统计结果存放的单元地址为COUNT。MOVAX,DATA;16位操作数送入AXMOVCX,16;置循环次数XORBL,BL;BL寄存器清零AGAIN:ROLAX,1;左循环移位1次,最高位进CFJNCNEXT;检查CF状态,若CF=0则跳转INCBL;若CF=1,则计数器BL加1NEXT:DECCX;循环次数减1JNZAGAIN;循环次数不为零,继续循环MOVCOUNT,BL;统计结果送存HLT 4.2.4串操作类指令所有的串操作指令隐含规定:1、用SI寻址源操作数且是在数据段中(DS为段地址)允许段超越;2、用DI寻址目的操作数且是在附加段中(ES为段地址)不允许段超越;3、这两个地址指针在每一个串操作以后会自动修改.按增量还是按减量,取决于方向标志位DF;若DF=0每次操作后SI和DI增量若DF=1则减量(字节操作加1,字操作则加2)4、要比较的字符串长度放在CX中;5、重复时在指令前加前缀REP。重复次数在CX中,CX中的值自动修改,直到CX为0。加前缀REP时,自动执行的操作:(1)CX=0?为零则退出REP,否则往下执行(2)CX-1→CX(3)执行串操作指令(4)重复(1)→(3)有些串操作指令还可加重复前缀,REPE/REPZ,REPNE/REPNZREPE/REPZ:当串未结束(CX≠0)且串相等(Z标志为1)时继续REPNE/REPNZ:当串未结束(CX≠0)且串不相等(Z标志为0)时继续 1[REP]MOVS[DI],[SI]/MOVSB/MOVSW;(MoveStringByte/Word)把串SI作为指针的源串中的一个字节或字,传送至由DI作为指针的目的串,且相应地址改为指针.以指向串中的下一个元素例:把100个字节从AREA1到AREA2也可采用重复前缀MOVSI,OFFSETAREA1MOVSI,OFFSETAREA1MOVDI,OFFSETAREA2MOVDI,OFFSETAREA2MOVCX,100MOVCX,100CLDCLDAGAIN:MOVS[DI],[SI]REPMOVSBDECCXJNZAGAIN 2LODS[SI]/LODSB/LODSW;(LoadString)本指令把由SI作为指令的串元素,传送至AL或AX,同时修改指令SI,使指向串的下一个元素,该指令正常是不重复执行的,因为每重复一次,累加器中的内容就要改写,只保留了最后一个元素。3[REP]STOS[DI]/STOSB/STOSW;(StoreString)(B/W)从累加器AL或AX传送一个字节或字,到由DI作为指针的目的串中同时修改DI以指向串中的下一个单元,利用重复操作,可以在串中建立相同的值。 4[REPE,REPNE]CMPS[DI],[SI]/CMPSB/CMPSW;(CompareString)由SI作为指针的源串中与由DI作为指针的目的串比较,但减的结果只反映到标志位上同时相应的修改源和目的指针可加前缀。例:比较两个字符串若相同在RESULT单元中置0.否则置0FFHMOVSI,OFFSETSTRING1MOVDI,OFFSETSTRING2MOVCX,COUNTCLDREPZCMPSBJNZNUMAT;串不相同MOVAL,0JMPOUTPUTNUMAT:MOVAL.0FFHOUTPUT:MOVRESULT,AL 5[REPE,REPNE]SCAS[DI]/SCASB/SCASW;(ScanString)串扫描指令,关键字放在AL(SCASB)或AX(SCASW)中,操作时从AL或AX的内容减去由DI作为指针的串元素,结果反映在标志位上,但并不改变目的串元素以及累加器的值。例:在以BLOCK开始的字符串中,搜索一字符A。MOVDI,OFFSETBLOCKMOVCX,COUNTMOVAL,’A’CLDREPNESCASBJZFOUNDJMPDONEFOUND:MOVBX,OFFSETBLOCKSUBDI,BXMOVBX,DI;串中第几个字符DONE:HLT 4.2.5控制转移类指令一、无条件转移指令JMP习惯:JMP标号(1)段内直接JMP:用指令中的偏移量加到目前指令指针IP上来改变IP实现跳转,当偏移量在+127~-128字节内就自动产生一个SHORTJMP指令,否则产生NEARJMP,在+32767~-32768范围内寻址。例:JMPSHORTOBJECTJMPNEARPTRTAGET(缺省)(2)段内间接JMP:目标地址由一个16位通用寄存器或内存单元来寻址例:JMPBX或JMPWORDPTR[BX](3)段间直接JMP:指令中给出转向地址的段地址和段内偏移量例:JMPFARPTRLABLE或JMP2000H:1000H(4)段间间接JMP:指令指定双字指针.用第一个字单元的内容代替lP.第二个字单元的内容代替CS例.JMPDWORDPTR[BX][SI] 二、条件转移指令这类指令转移的目的地址是采用相对寻址方式即以转移指令为基准的+127或-128字节的范围之内,对标志位无影响。1直接标志转移指令JC标号;JNC标号;JS标号;JNS标号;JO标号;JNO标号;JP标号;JNP标号;JZ/JE标号;JNZ/JNE标号; 2间接标志转移指令无符号数比较测试:JAE/JNB标号JA/JNBE标号JB/JNAE标号JBE/JNA标号带符号数比较测试:JG/JNLE标号JGE/JNL标号JL/JNGE标号JLE/JNG标号“A”Above高于“B”Below低于“G”Greatthan大于“L”Lessthan小于3寄存器测试转移指令JCXZ标号 例:存储器中以BLOCK为首地址连续存放着20个16位的带符号数,要求找出其中的最小数,并存放在MIN单元中。LEASI,BLOCK;SI←数组的首地址MOVAX,[SI];AX←数组的第一个数MOVCX,19;CX←循环次数INCSI;SI←(SI)+1INCSI;SI←(SI)+1LOP:CMPAX,[SI];两个数比较,即AX-[SI]JLNEXT;若AX<[SI],则转向NEXTMOVAX,[SI];若AX≥[SI],则AX←[SI]NEXT:INCSI;SI←(SI)+1INCSI;SI←(SI)+1DECCX;CX←(CX)-1,修改循环次数JNZLOP;循环未完,则转向LOPMOVMIN,AX;循环结束,MIN←(AX)HLT;停止 三、循环控制指令格式LOOPxx符号地址执行①(CX)←(CX)―1此操作不影响标志②检查转移条件,满足,转向目标地址去执行;不满足,执行LOOPxx后一条指令转移方式只允许段内直接短方式,跳转范围-128~127 例:数据段中分别以FIRST和SECOND为首地址存放着100个字符,找出其中第一个不相同的字符分别送至AL和BL寄存器,若两串完全相同,则令AL=BL=0。LEASI,FIRST;SI←字符串1首地址LEADI,SECOND;DI←字符串2首地址MOVCX,100;CX←循环次数CYCLE:MOVAL,[SI];AL←串1中的字符MOVBL,[DI];BL←串2中的字符INCSI;SI←(SI)+1INCDI;DI←(DI)+1CMPAL,BL;(AL)-(BL)LOOPECYCLE;若(CX)≠0,且ZF=1,则跳转JNZDONE;若相应内容不等,则转向DONEMOVAL,0;若两串完全相同,则AL←0MOVBL,0;若两串完全相同,则BL←0DONE:HLT;停止 四、过程调用和返回指令主程序子程序调用返回返回指令返回、、、、、、、、、、、、调用指令、、、、、、、、、、、、调用主程序子程序、、、 CALL-RET指令对CALL:调用子程序,调用结束后要返回CALL指令的下一条指令,所以必须保存断点;RET:子程序或过程的最后一条指令用以返回到调用这个子程序的断点处说明:1)CALL-RET要保护现场;2)对于段内调用(NEAR属性)CALL,使IP入栈,目标过程的地址偏移量加到IP上;CALL(NEARPTR)过程名对于段间调用(FAR属性)CALL,首先CS入栈,CS再由指令串的段值代替,然后IP入栈,IP由子程序中第一条指令的偏移地址代替。CALLFARPTR过程名格式CALL过程名格式RET 五、中断控制指令INTN;中断指令N=0-255入栈FLAGS,清除IF、TF;入栈CS、IP,中断服务程序入口地址送CS、IP。SP←(SP)-2,((SP)+1:(SP))←(FLAGS)TF←0,IF←0SP←(SP)-2,((SP)+1:(SP))←(CS)SP←(SP)-2,((SP)+1:(SP))←(IP)CS←(N×4+2)IP←(N×4)IRET;中断返回出栈IP、CS、FLAGSIP←((SP)+1:(SP)),SP←(SP)+2CS←((SP)+1:(SP)),SP←(SP)+2FLAGS←((SP)+1:(SP)),SP←(SP)+2例:设存储单元(0005C)=12H,(0005D)=34H,(0005E)=56H,(0005F)=78H,指令INT17H执行后,中断服务程序入口地址如何确定?17H×4=5CH,则CS=((0005F):(0005E))=7856H,IP=((0005D):(0005C))=3412H中断服务程序入口地址为(CS)×10H+(IP)=7856H×10H+3412H=7B972H 4.2.6处理器控制类指令一、标志操作共有7条3条针对CF2条针对DF有2条针对IF1CLC(ClearCarryFlag)2CMC(ComplementCarryFlag)3STC(SetCarryFlag)4CLD(ClearDirectory)5STD(SetDirectory)6CLI(ClearInterruptEnableflag)7STI(SetInterruptEnableFlag) 二、处理器暂停HLT(halt)它使CPU进入暂停状态,不进行任何操作,只有当下列情况之一发生时,CPU才脱离暂停状态。RESET线上加复位信号NMI线上出现中断请求信号在IF=1情况下,INTR引脚上出现中断请求信号三、处理器等待WAIT四、处理器脱离ESC五、总线锁定LOCK(前缀)六、空操作NOP:不完成任何操作,执行时耗费3个时钟周期的时间 4.3.1实地址方式下的寻址方式立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址加变址的寻址方式相对的基址变址寻址方式I/O端口寻址即80X86实地址下的寻址方式及指令系统与8086基本相同4.380X86的寻址方式存储器寻址 4.3.2保护虚地址方式下的寻址方式前8种寻址方式与实方式一样区别:有效地址可以是32位偏移量形式,操作数可以是8位、16位、32位。8个32位通用寄存器均可用作寄存器间接寻址8个32位通用寄存器均可作为基址、变址寄存器(除ESP),以出现的顺序默认段基值。9具有比例因子的相对变址寻址比例因子=1、2、4、8EA=变址寄存器×比例因子+位移量10具有比例因子的基址变址寻址EA=变址寄存器×比例因子+基址寄存器11具有比例因子的相对基址变址寻址EA=变址寄存器×比例因子+基址寄存器+位移量 说明:1、PUSHA/POPA将所有8个16位通用寄存器的内容依次压入/弹出堆栈。压入顺序AX、CX、DX、BX、SP、BP、SI、DI,压入SP是该指令执行前的值,弹出时自动丢弃;2、三操作数乘法指令是将源1乘以源2结果送入目的操作数;3、移位指令中的立即数从原来的1扩充到31;4、INS/OUTS以DX为外设端口,指令格式同其它串操作类指令。[REP]INS[DI],DX/INSB/INSW[REP]OUTSDX,[SI]/OUTSB/OUTSW4.3.380286扩充与增加的指令 4.3.480386/80486扩充与增加的指令 说明:1、PUSHAD/POPAD是将32位通用寄存器压/出栈,顺序和原则与80286相同;2、带符号数扩展传送MOVSX,将R/M中的符号扩展到REG中所有多余高位;3、字节交换指令BSWAP4、比较与交换CMPXCHG将OP1与(AL、AX、EAX)比较,影响ZF标志,若相等OP2→OP1,若不等OP1→(AL、AX、EAX)。5、交换与相加XADD目的+源→目的,同时将原目的→原源数;12345678 6、CWDE;AXEAXCDQ;EAXEDXEAX7、双精度逻辑左移SHLD双精度逻辑左移SHRD操作之后,R不变,R/M的低位由R的高位依次移入;8、位测试BTR/M,R/M测试目标操作数中由源数指定的那一位状态,并将结果送CF标志;位测试并求反BTC测试目标操作数中由源数指定的那一位状态,并将结果送CF标志,然后使该位取反;位测试并置位BTS位测试并复位BTR向前位扫描指令BSF从源操作数的最低位向高位扫描,将出现第一个1的位号存入目的操作数,并影响ZF标志;向后位扫描指令BSRCFRR/MCFR/MR 9、SETOR/M;若OF=1,则1→R/M;否则0→R/MSETNOSETCSETNCSETZSETNZSETSSETNSSETPSETNPSETBESETNBE(无符号数)SETLSETNLSETLESETNLE(带符号数)10、80286、80386、80486还有一些保护方式指令,用户一般不需用它们编程,在此不做介绍。