程序控制指令
五、程序控制指令 转移类指令可改变CS与IP的值或仅改变IP的值,以改变指令执行的顺序。 1.无条件转移、调用和返回指令 (1) 无条件转移指令JMP 分直接转移和间接转移两种。 一般格式: JMP OPRD ;OPRD是转移的目的地址 直接转移的3种形式为: 短程转移 JMP SHORT OPRD ;IP=IP+8位位移量 目的地址与JMP指令所处地址的距离应在-128~127范围之内。 近程转移 JMP NEAR PTR OPRD ;IP=IP+16位位移量 或 JMP OPRD ;NEAR可省略 目的地址与JMP指令应处于同一地址段范围之内。 远程转移 JMP FAR PTR OPRD ;IP=OPRD的段内位移量,CS=OPRD所在段地址。 远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容。 间接转移指令的目的地址可以由存储器或寄存器给出。 段内间接转移 JMP WORD PTR OPRD ;IP=[EA] (由OPRD的寻址方式确定)。 JMP WORD PTR[BX] IP=((DS)*16+(BX)) JMP WORD PTR BX IP=(BX) 段间间接转移 JMP DOWRD PTR OPRD;IP=[EA],CS=[EA+2] 该指令指定的双字节指针的第一个字单元内容送IP,第二个字单元内容送CS。 JMP DWORD PTR [BX+SI] (2) 调用和返回指令 CALL指令用来调用一个过程或子程序。由于过程或子程序有段间(即远程FAR)和段内调用(即近程NEAR)之分。所以CALL也有FAR和NEAR之分。因此RET分段间与段内返回两种。 调用指令一般格式为: 段内调用 CALL NEAR PTR OPRD ; 操 作 SP=SP-2,((SP)+1),(SP))=IP,IP=IP+16位位移量 CALL指令首先将当前IP内容压入堆栈。当执行RET指令而返回时,从堆栈中取出一个字放入IP中。 段间调用 CALL FAR PTR OPRD ; 操 作 SP=SP-2,((SP)+1),(SP))=CS;SP=SP-2,((SP)+1),(SP))=IP;IP=[EA];CS=[EA+2] CALL指令先把CS压入堆栈,再把IP压入堆栈。当执行RET指令而返回时,从堆栈中取出一个字放入IP中,然后从堆栈中再取出第二个字放入CS中,作为段间返回地址。 返回指令格式有: RET ;SP=((SP+1),SP),SP=SP+2 RET n ;SP=((SP+1),SP),SP=SP+2 SP=SP+n RET n指令要求n为偶数,当RET正常返回后,再做SP=SP+n操作。 2.条件转移指令 8086有18条不同的条件转移指令。它们根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移指令的目的地址必须在现行的代码段(CS)内,并且以当前指针寄存器IP内容为基准,其位移必须在十127~—128的范围之内。如表4所示。
从该表可以看到,条件转移指令是根据两个数的比较结果或某些标志位的状态来决定转移的。在条件转移指令中,有的根据对符号数进行比较和测试的结果实现转移。这些指令通常对溢出标志位OF和符号标志位SF进行测试。对无符号数而言,这类指令通常测试标志位CF。对于带符号数分大于、等于、小于3种情况;对于无符号数分高于、等于、低于3种情况。在使用这些条件转移指令时,一定要注意被比较数的具体情况及比较后所能出现的预期结果。 3.循环控制指令 对于需要重复进行的操作,微机系统可用循环程序结构来进行,8086/8088系统为了简化程序设计,设置了一组循环指令,这组指令主要对CX或标志位ZF进行测试,确定是否循环,如表5所示。
【例7】 有一首地址为ARRAY的M个字数组,试编写一段程序,求出该数组的内容之和(不考虑溢出),并把结果存入TOTAL中,程序段如下: MOV CX,M ;设计数器初值 MOV AX,0 ;累加器初值为0 MOV SI,AX ;地址指针初值为0 START:ADD AX,ARRAY[SI] ADD SI,2 ;修改指针值(字操作,因此加2) LOOP START ;重复 MOV TOTAL,AX ;存结果 【例8】 有一字符串,存放在ASCIISTR的内存区域中,字符串的长度为L。要求在字符串中查找空格(ASCII码为20H),找到则继续运行,否则转到NOTFOUND去执行。实现上述功能的程序段如下: MOV CX,L ;设计数器初值 MOV SI,-1 ;设地址指针初值 MOV AL,20H ;空格的ASCII码送AL NEXT: INC SI CMP AL,ASCIISTR[SI] ;比较是否空格? LOOPNZ NEXT JNZ NOTFOUND …… …… NOTFOUND: …… ……
|
电工学习网 ( )
GMT+8, 2021-12-6 20:45