您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 3-10循环控制指令过程调用和返回指令串操作指令中断
四控制转移指令•转移类指令•循环控制指令•过程调用和返回指令•中断控制类指令2循环控制指令•用在循环程序中以确定是否要继续循环。•循环次数通常置于CX中。•转移的目标应在距离本指令-128~+127的范围之内。•循环控制指令不影响标志位。格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,则转至label处执行;否则退出循环,执行LOOP后面的指令。LOOP指令与下面的指令段等价:DECCXJNZlabel(1)循环转移指令LOOP(2)LOOPZ(LOOPE)格式:LOOPZlabel操作:(CX)-1→CX;若(CX)≠0且ZF=1,则转至label处继续循环;否则退出循环,执行LOOP后面的指令。(3)LOOPNZ(LOOPNE)格式:LOOPNZlabel操作:(CX)-1→CX;若(CX)≠0且ZF=0,则转至label处继续循环;否则退出循环,执行LOOP后面的指令。3过程调用和返回指令•过程(子程序):一段具有特定功能的,供其它程序调用的公用程序。•特点调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。子程序执行结束后一般均要返回调用程序。一次定义,可多次调用;可带参数调用,以完成不同的功能。(1)调用指令CALL一般格式:CALLsub;sub为子程序的入口。根据子程序入口的寻址方式,子程序调用有四类。①段内直接调用子程序的偏移地址直接由CALL指令给出。格式:CALLNEAR_PROCCALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上。②段内间接调用子程序的偏移地址在寄存器或存储器中。格式:CALLmem16/reg16CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP。例:CALLAX;调用地址由AX给出CALLWORDPTR[SI];调用地址由存储器给出.例:对于CALLWORDPTR[SI]这条指令若:(DS)=8000H,(SI)=1200H则指令操作图示如下。CALLIPHIPL代码段数据段81200H81201H③段间直接调用子程序的段地址和偏移地址直接由CALL指令给出。格式:CALLFAR_PROC;FAR_PROC为远过程的地址指令的操作:((SP)-1,(SP)-2)←(CS);原CS压栈SP←(SP)-2CS←新段地址((SP)-1,(SP)-2)←(IP);原IP压栈SP←(SP)-2IP←新偏移地址例:CALL2000H:1000H④段间间接调用子程序的段地址和偏移地址为存储器的连续4个单元中的内容。格式:CALLmem32指令的操作为:((SP)-1,(SP)-2)←(CS);原CS压栈SP←(SP)-2CS←(mem32+2)((SP)-1,(SP)-2)←(IP);原IP压栈SP←(SP)-2IP←(mem32)例:CALLDWORDPTR[DI]调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。CALL代码段数据段IPHIPLCSHCSL[DI][DI]+1[DI]+2[DI]+3CALLDWORDPTR[DI](2)返回指令RET段内返回指令RET的操作为:IP←((SP)+1,(SP));栈顶内容弹出到IPSP←(SP)+2段间返回指令RET的操作为:IP←((SP)+1,(SP));栈顶内容弹出到IPSP←(SP)+2CS←((SP)+1,(SP));栈顶内容弹出到CSSP←(SP)+2另有一种带立即数返回指令:RETn其中n为偶数,表示从栈顶弹出地址后另外丢弃的字节数。例:RET4;返回后再丢弃栈顶的4个字节4中断控制指令8086/8088CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫内部中断,或叫软中断。中断指令共有三条:(1)INTn执行类型n的中断服务程序,N=0~255(2)INTO执行溢出中断的中断服务程序;(3)IRET从中断服务程序返回调用程序。四串操作指令•字符串传送指令MOVSB/MOVSW•字符串比较指令CMPSB/CMPSW•字符串检索指令SCASB/SCASW•取字符串指令LODSB/LODSW•存字符串指令STOSB/STOSW•串:顺序放在内存中的一组相同类型的数据。•串操作:对串中的元素进行相同的操作。•串操作的寻址方式:源操作数指针———DS:SI(DS可重设)目的操作数指针——ES:DI•每次串操作后:串操作指令自动修改SI和DI——字节:±1,字:±2。DF标志决定±。•注意:退出串操作后,指针指向最后操作的元素的下一个元素。功能:可完成存储单元到存储单元的传送、比较(也仅是串指令可以)。有的串操作指令前面可加重复前缀。当使用重复前缀时,操作重复次数由CX决定(CX自动减量)。该指令重复执行,直至(CX)=0为止。注意:执行串指令之前,应先进行如下设置:1)源串首地址(末地址)→SI2)目的串首地址(末地址)→DI3)串长度→CX4)建立方向标志(CLD使DF=0(增),STD使DF=1(减))(1)串传送指令MOVSB/MOVSW指令执行的操作为:MOVSB;((ES):(DI))←((DS):(SI))SI±1,DI±1MOVSW;(ES):(DI+1)(DI))←((DS):(SI+1)(SI))SI±2,DI±2注意:原串用DS:SI寻址,目标串用ES:DI寻址是唯一的原操作数和目的操作数在存储器中的传送指令。例:在数据段ADDR1地址处有200个数据,要传送到数据段地址ADDR2处。MOVSI,OFFSETADDR1MOVDI,OFFSETADDR2MOVCX,200CLDREPMOVSBLEASI,ADDR1LEADI,ADDR2(2)串比较指令CMPSB/CMPSW指令执行的操作为:CMPSB;((DS):(SI))-((ES):(DI))SI±1,DI±1CMPSW;((DS):(SI+1)(SI))-((ES):(DI+1)(DI))SI±2,DI±2比较的结果只反映在标志位上,串本身无变化。本指令可用来检查两个串是否相等。与重复前缀REPZ/REPE、REPNZ/REPNE结合使用。(3)串扫描SCASB/SCASW执行的操作:对字节:(AL)-((ES):(DI))DI±1对字:(AX)-((ES):(DI+1)(DI))DI±2搜索指令执行的仍是比较(减法)操作,结果只影响标志位。要搜索的关键字放在AL(字节)或AX(字)中。本指令用于在串中查找指定的信息。与重复前缀REPZ/REPE、REPNZ/REPNE结合使用。(4)串读取指令LODSB/LODSW执行的操作为:对字节:(AL)←((DS):(SI))SI±1对字:(AX)←((DS):(SI+1)(SI))SI±2串读取指令通常不加重复前缀。LODSB等价于:LODSW等价于:MOVAL,[SI]MOVAX,[SI]INCSIINCSIINCSI(5)串存储指令STOSB/STOSW写指令的操作为:对字节:((ES):(DI))←(AL)DI±1对字:((ES):(DI+1)(DI))←(AX)DI±2本指令用于把一块存储区域填充成某一初始值(即对存储区进行初始化)。例:把1000H开始的100个存储单元填入ASCII码2AH(*)。程序段如下:MOVDI,1000H;首地址MOVAL,2AH;‘*’MOVCX,100;重复执行100次CLD;增量修改DIREPSTOSB本章小结•80x86指令的操作数包括3种形式:立即数、寄存器(通用寄存器和段寄存器)与内存操作数。•对于内存操作数,由操作数的形式可计算出有效地址。在缺省情况下,其段地址隐含在段寄存器DS或SS中,除非由段超越前缀明确给出。•大多数指令(如传送类指令)的执行不影响标志位,某些指令(如算术指令)的执行按一般规则影响标志位,还有一部分指令(如逻辑指令)会按特定方式(清0、置1等)影响标志位。部分8086/8088常用指令指令类型助记符数据传送数据传送MOV,PUSH/POP,XCHG等地址传送LEA,LDS,LES输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,NEG,CMP乘/除法MUL,IMUL,DIV,IDIV逻辑AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET练习:(1)已知(AX)=1234H,执行下面3条指令后,(AX)=________.MOVBX,AXNEGBXADDAX,BX0000H(2)如执行XORAH,AHMOVAL,90HCWD指令后,结果是_____________(DX,AX)=00000090H(3)解析下面程序段,回答问题:MOVCX,DXNOTCXADDCX,DXINCCX问:(CX)=_________,(ZF)=________0000H1(4)下面指令序列完成的运算表达式应是______________MOVAL,BYTEPTRXSHLAL,1DECALMOVBYTEPTRY,ALY=2*X-1MOVCL,8ROLAX,CLADDAX,BX(5)已知(AX)=0012H,(BX)=0043H,要求把它们形成(AX)=1234H提示:可以用循环移位指令作业1.指出下列指令的错误:(1)MOVAX,[SI][DI](2)MOV[BX],[SI](3)ADDAX,BYTEPTR[BX](4)JMPBYTEPTR[BX](5)OUT230H,AX2.堆栈指针寄存器SP的初值为1000H,(AX)=2000H,(BX)=3000H,试问:(1)执行指令PUSHAX后,(SP)=()(2)再执行指令PUSHBX和POPAX后,(SP=(),(AX)=(),(BX)=()。3.判断下列执行程序后,BX的内容MOVCL3MOVBX0B7HROLBX1RORBX,CL4.指出下面程序段的功能CLDLEADI,[1200H]MOVCX,0F00HXORAX,AXREPSTOSW5.写出完成下列功能的程序段(1)从地址DS:0012H中送一个数据56H到AL寄存器。(2)AL的内容与字节单元DS:0013H中的内容相乘,乘积存入子单元DS:0014H。
本文标题:3-10循环控制指令过程调用和返回指令串操作指令中断
链接地址:https://www.777doc.com/doc-312427 .html