
(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


