第6节 控制转移指令
推荐给好友
打印
加入收藏
更新于2009-06-01 10:45:02


(1)无条件转移指令
JMP <转向地址>

  • addr32 = CS:disp16
  • d1 = Rc 16, M12 ;16位通用寄存器或存储器中连接2个单元
  • d2 = M1234 ;存储器中连接4个单元

1)段内相对短转移指令
JMP SHORT disp8
; IP<--IP + disp8
disp8 = -128~127

2)段内相对近转移指令
JMP NEAR PTR disp16
; IP<--IP + disp16
disp8 = -32768~32767

3)段内间接转移指令
JMP WORD PTR d1
; IP<--d1
d1 = Rc16 , M12 ,16位通用寄存器或存储器中连接2个单元内容


4)段间直接转移
JMP FAR PTR addr32
; CS<--addr32分段部分
IP<--addr32偏移部分

例:当前CS=2100h, IP=1500h, addr32为目标地址标号,目标地址在另一个代码段,其段地址为6500h, 偏移地址为020Ch, 执行指令后,转移到6520Ch目标地址去执行后续指令。


5)段间间接转移
JMP DWORD PTR d2
; d2 = M1,2,3,4
IP<--M1,2
CS<--M3,4

例:JMP DWORD PTR[BX+100h]
DS = 2000h, BX=1000h


(2)条件转移指令
JX disp8
; IP<--IP + disp8 , disp8 = -128~127

  • 根据上一条指令影响的状态位来判断是否转移。
  • 特点:
    1. 条件转移指令全部为段内转移
    2. 目标地址在当前指令的 -128~127 范围内。
    3. 目标地址由操作数disp8确定。
    4. 条件转移指令不影响标志位。

1)根据条件标志(C,Z,S,O,P)转移
JX disp8
; X 为标志条件(C,Z,S,O,P)
IP<--IP + disp8 , disp8 = -128~127


例1:计算Y=|X|


2)无符号数大小的比较转移(A-B)
JX disp8
; X 为标志条件,可能是两个条件的组合,A,B ,E,N
IP<--IP + disp8 , disp8 = -128~127
根据组合条件标志的设置情况转移 —— 主要用来比较两个数的大小


A—Above, B—Below, E—Equal, N--Not

3)有符号数大小的比较转移(A-B)
JX disp8
; X 为标志条件,可能是两个条件的组合,G,L,E,N
IP<--IP + disp8 , disp8 = -128~127
根据组合条件标志的设置情况转移 —— 主要用来比较两个数的大小


G—Great, L—Less, E—Equal, N--Not

例2:两无符号数相加,结果正确则Ax 中存入1,若溢出则AX中存入0。


例3:有一组无符号数,与50比较,大于50 的存入另一存储区,小于或等于50的放弃。


例4:数组 ARRAY 为N字数组,要求将其中正数、 0、负数、 的个数统计出来,分别存入寄存器 DI、SI、AX中。


例5:用条件转移指令实现长字节转移。
如:jz next ;next 地址大于 -128~+127范围。


例6:数出长度为10的,以string为首地址的字符串中空格的个数。


(3)循环控制指令
循环控制指令 disp8


与REP, REPE, REPNE的区别?

1)循环指令
LOOP disp8
;CX<--CX-1;
若CX ≠ 0 则IP<-- IP + disp8 , disp8 = -128~127


2)相等循环指令
LOOPE / LOOPZ disp8
;CX<--CX-1;
若CX ≠ 0 且Z=1 则IP<--IP + disp8 , disp8 = -128~127


3)不相等循环指令
LOOPNE / LOOPNZ disp8
;CX<--CX-1;
若CX ≠ 0 且Z=0 则IP<--IP + disp8 , disp8 = -128~127


4)CX=0循环指令
JCXZ disp8
; *CX不减1
若CX = 0 则IP<--IP + disp8 , disp8 = -128~127


例6-1:数出长度为10的,以STRING为首地址的字符串中空格的个数。


例7:有一串n个字符的字符串(ABCDEFGH IJK) 存储于首地址为ASC的存储区, 要求查找空格的位置。


结果:若SI=0 表示没找到空格;SI ≠0,表示找到了,SI指向空格的单元。

(4)子程序调用及返回指令
CALL <调用地址>
RET


CALL disp16,
CALL BX,
CALL far ptr addr32,
CALL DWORD PTR[BX]

1)段内相对调用指令(近过程)
CALL NEAR PTR disp16
;SP<-- SP – 2 , Stack<--IP (IP入栈)
IP<--IP + disp16
disp16=16位的地址或一个近过程名
CALL N_PROC; N_PROC为近过程名
CALL 1000h
与段内相对近转移指令 JMP NEAR disp16的区别?

2)段内间接调用指令(近过程)
CALL WORD PTR d1
;SP<--SP – 2 , Stack<--IP (IP入栈)
IP<--d1
d1=RC16, M 寻址
CALL BX;
CALL WORD PTR[BX]
与段内间接转移指令 JMP WORD PTR d1的区别?

3)段间直接调用指令(远过程)
CALL FAR PTR addr32
; SP<--SP – 2, Stack<--CS (CS入栈)
SP<--SP – 2 , Stack<--IP (IP入栈)
IP<--addr32偏移地址
CS<--addr32段地址
CALL F_PROC; F_PROC为远过程名
CALL 2000h:1000h
与段间直接转移 JMP FAR PTR addr32的区别?

4)段间间接调用指令(远过程)
CALL DWORD PTR d2
; SP<-- SP – 2, Stack<--CS (CS入栈)
SP<--SP – 2 , Stack<--IP (IP入栈)
IP<--[d2]
CS<--[d2+2]
d2=M寻址 , M中的连续4个单元中的内容送IP,CS
CALL DWORD PTR[BX]
段间间接转移 JMP DWORD PTR d2的区别?

操作:
段内调用:CALL 标号
(SP)<-- (SP)-2
(SP)+1, (SP)<--(IP)
(IP)<--调用地址
段内返回: RET
IP<--(SP)+1, (SP)
(SP)<--(SP)+2


5)段内返回指令 RET
; IP<--Stack , SP<--SP +2 (IP出栈)

6)段内带参数返回指令 RET n
; IP<--Stack , SP<--SP +2 (IP出栈)
SP<--SP + n

7)段间返回指令 RET
; IP<--Stack , SP<--SP +2 (IP出栈)
CS<--Stack , SP<--SP +2 (CS出栈)

8)段间带参数返回指令 RET n
; IP<--Stack , SP<--SP +2 (IP出栈)
CS<--Stack , SP<--SP +2 (CS出栈)
SP<--SP + n

RET n
在调用子程序时,有时需要传递参数,一种方式是主程序将参数压栈,以便子程序调用。
而子程序返回后,该参数即无用,若留在堆栈中则占用堆栈空间,故用 RET n 指令将其释放。
例如: RET 4


(5)中断及中断返回指令


1) 软中断


中断向量表(中断服务子程序入口地址表)
中断类型码n(上表中每项的编号0~255)

2) 溢出中断(中断类型码n=4)


3) 中断返回


** 系统功能调用指令
INT 21h
; DOS操作系统所具有的功能,用于系统功能调用。


*1)等待键盘输入并回显(AH = 1)
MOV AH, 1
INT 21h
输出:AL = 键盘输入字符的ASCII码

*2)输出字符到显示器(AH = 2)
输入:DL = 要输出字符的ASCII码
MOV AH, 2
INT 21h

*3)终止程序并返回DOS(AH = 4Ch)
MOV AH, 4Ch
INT 21h

 

上一节                    下一节

相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.