文章目录
- [一、无条件转移指令 JMP](#一、无条件转移指令 JMP)
- 二、条件转移指令
- 三、循环指令
- 四、子程序调用返回指令
-
- [(一)调用指令 CALL](#(一)调用指令 CALL)
- [(二)返回指令 RET](#(二)返回指令 RET)
- 五、中断与中断返回指令
-
- [(一)中断指令 INT & INTO](#(一)中断指令 INT & INTO)
-
- [(1)中断指令 INT](#(1)中断指令 INT)
- [(2)溢出中断指令 INTO](#(2)溢出中断指令 INTO)
- [(二)中断返回指令 IRET](#(二)中断返回指令 IRET)
一、无条件转移指令 JMP
无条件跳转指令JMP跳转至地址 CS:[IP]
段内寻址只修改IP,段间寻址既修改IP也修改CS
- 段内直接短转移
- 格式 :
JMP SHORT OPR
- 执行操作 :
(IP) ← (IP)+8位位移量
- 格式 :
- 段内直接近转移
- 格式 :
JMP NEAR PTR OPR
- 执行操作 :
(IP) ← (IP)+16位位移量
- 格式 :
- 段内间接转移
- 格式 :
JMP WORD PTR OPR
- 执行操作 :
(IP) ← (EA)
- 格式 :
- 段间直接远转移
- 格式 :
JMP FAR PTR OPR
- 执行操作 :
(IP) ← OPR的段内偏移地址
,(CS) ← OPR所在段的段地址
- 格式 :
- 段间间接转移
- 格式 :
JMP DWORD PTR OPR
- 执行操作 :
(IP) ← (EA)
,(CS) ← (EA+2)
- 格式 :
二、条件转移指令
只能使用段内直接寻址的8位位移量
-
根据单个条件标志的设置情况转移
-
比较两个无符号数,根据比较结果转移
适用于地址 或双精度数低位字的比较
-
比较两个带符号数,根据比较结果转移
适用于带符号数的比较
举例 :n=8 bit 带符号数(-128~127),无符号数(0~255)
三、循环指令
类型
-
循环指令 LOOP
LOOP OPR
测试条件:(CX)≠0
-
为零/相等时循环指令 LOOPZ/LOOPE
LOOPZ(LOOPE) OPR
测试条件:ZF=1 且 (CX)≠0
-
不为零/不相等时循环指令 LOOPNZ/LOOPNE
LOOPNZ(LOOPNE) OPR
测试条件:ZF=0 且 (CX)≠0
执行的操作
(CX) ← (CX)-1
(CX中存放循环次数)- 检查是否满足测试条件
如满足则:(IP) ← (IP)+8位位移量
,实行循环
不满足则: IP 不变,退出循环
只能使用段内直接寻址的8位位移量
四、子程序调用返回指令
(一)调用指令 CALL
(1)段内近调用
-
格式 :
CALL DST
-
执行操作
(SP) ← (SP)-2
((SP)+1,(SP)) ← (IP)
(IP) ← (IP)+16位位移量
(2)段内间接近调用
-
格式 :
CALL DST
-
执行操作
(SP) ← (SP)-2
((SP)+1,(SP)) ← (IP)
(IP) ← (EA)
(3)段间直接远调用
-
格式 :
CALL DST
-
执行操作
(SP) ← (SP)-2
((SP)+1,(SP)) ← (CS)
(SP) ← (SP)-2
((SP)+1,(SP)) ← (IP)
(IP) ← 偏移地址
(CS) ← 段地址
(4)段间间接远调用
-
格式 :
CALL DST
-
执行操作
(SP) ← (SP)-2
((SP)+1,(SP)) ← (CS)
(SP) ← (SP)-2
((SP)+1,(SP)) ← (IP)
(IP) ← (EA)
(CS) ← (EA+2)
(二)返回指令 RET
(1)段内近返回
-
格式 :
RET
-
执行操作
(IP) ← ((SP)+1,(SP))
(SP) ← (SP)+2
(2)段内带立即数近返回
- 格式 :
RET EXP
(3)段间远返回
-
格式 :
RET
-
执行操作
(IP) ← ((SP)+1,(SP))
(SP) ← (SP)+2
(CS) ← ((SP)+1,(SP))
(SP) ← (SP)+2
(4)段间带立即数远返回
- 格式 :
RET EXP
五、中断与中断返回指令
(一)中断指令 INT & INTO
(1)中断指令 INT
-
格式 :
INT TYPE
或INT
-
执行操作
(SP) ← (SP-2)
((SP)+1,(SP)) ← (FLAGS)
(SP) ← (SP)-2
((SP)+1,(SP)) ← (CS)
(SP) ← (SP)-2
((SP)+1,(SP)) ← (IP)
(IP) ← (TYPE*4)
(CS) ← (TYPE*4+2)
(2)溢出中断指令 INTO
-
格式 :
INTO
-
执行操作
若 OF=1(即溢出)
(SP) ← (SP-2)
((SP)+1,(SP)) ← (FLAGS)
(SP) ← (SP)-2
((SP)+1,(SP)) ← (CS)
(SP) ← (SP)-2
((SP)+1,(SP)) ← (IP)
(IP) ← (10H)
(CS) ← (12H)
(二)中断返回指令 IRET
-
格式 :
INTO
-
执行操作
(IP)←((SP)+1,(SP))
(SP)←(SP)+2
(CS)←((SP)+1,(SP))
(SP)←(SP)+2
(FLAGS)←((SP)+1,(SP))
(SP)←(SP)+2
注意
- TYPE(0~255)是中断类型号,隐含的类型号为 3
- INT 指令还把 IF 和 TF 置 0,但不影响其它标志位
- IRET 指令执行完,标志位由堆栈中取出的值确定