程序与处理器控制指令(六)
程序控制类指令本质是控制程序的执行方向。
决定程序执行方向的因素:CS,IP
修改IP,改变程序在代码段中的执行顺序。
同时修改CS和IP,程序换另一个代码段执行
通过修改IP或CS和IP,实现程序的顺序,分支,循环结构
分类:
- 转移指令
- 循环控制
- 过程调用
- 中断控制
转移指令
通过修改指令的偏移地址或段地址和偏移地址是实现程序的转移。
- 无条件转移指令
- 无条件转移到目标指令
- 条件转移指令
- 当具备一定条件时(通常指状态标志位)转移到目标地址
无条件转移指令
可以实现段内或者段间的转移
格式:
JMP OPRD
OPRD:目标地址
无条件段内转移
转移的目标地址在当前代码段内,段地址不改变,目标地址16位偏移地址。
段内直接转移:指令直接给出目标地址
段内间接转移:由寄存器或者存储器指出目标地址
例:
1 | MOV BX,1200H |
无条件段间转移
转移的目标地址不在当前代码段内,目标地址是32位地址(16位偏移地址和16位段基地址)
段间直接转移:指令直接给出目标地址
段间间接转移:目标地址由指令中的32位操作数给出,32位目标地址存放于内存
例:
1 | MOV SI,1122H |
条件转移指令
满足一定条件后,实现程序的转移。
条件转移指令均为段内短转移,转移范围为:-128至+127
循环控制指令
控制程序重复执行一段代码的指令,循环次数由CX寄存器决定
循环范围:
以当前IP为中心的-128至+127范围内循环
指令:
前一条指令为无条件循环指令,后面两条为条件循环指令
- LOOP 循环条件:CX≠0
- LOOPZ 循环条件:CX≠0,ZF=1
- LOOPNZ 循环条件:CX≠0,ZF=0
过程调用指令
调用一个子程序,子程序执行结束后返回调用的指令的下一条指令,返回的地方称为断点
执行过程:
- 将断点地址压入堆栈
- 获取程序第1条指令的地址
- 执行子程序
- 返回原程序
类型:
- 段内调用
- 段内直接调用
- 段内间接调用
- 段间调用
- 段间直接调用
- 段间间接调用
段内调用
被调用程序和调用程序在同一代码段
格式:
直接调用:
CALL TIMER
间接调用:
CALL WORD PTR[SI]
段间调用
被调用程序和调用程序不在同一代码段
调用前需保护断点的段基地址和偏移地址
格式:
CALL FAR TIMER
CALL DWORD PTR[SI]
返回指令
从堆栈中弹出断点地址,返回原程序
格式:
RET
子程序最后一条指令必须是RET
中断指令
因随机事件或异常事件使一个正在执行的过程转向另一个过程,执行完后返回原程序。
中断一定是远过程调用。
格式:
INT n
n:中断类型码0-255
说明:
首先做一个n * 4的运算,n * 4得到的数指向内存的一个特殊单元
这个单元所在的区域被称为中断向量表,0H-003FFH
该区域属于DS
中断和过程调用的区别
- 中断是随机事件或异常事件引起,调用是事先在程序中安排好的
- 调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中
- 调用可以是近过程或远过程调用,中断处理程序均为远过程
- 响应中断请求不仅要保护断点地址,还要保护FLAGS内容
中断返回指令
中断服务程序的最后一条指令,恢复断点,标志寄存器内容
格式:
IRET
处理器控制指令
控制CPU,均为零操作数格式指令。
- 对标志位的操作
- 与外部设备同步
标志位操作指令
CF
格式:
CLC
说明:
CF=0
格式:
STC
说明:
CF=1
格式:
CMC
说明:
CF取反
DF
格式:
CLD
说明:
DF=0
格式:
STD
说明:
DF=1
IF
格式:
CLI
说明:
IF=0,清中断标志位,即关中断
格式:
STI
说明:
IF=1,中断标志位置位,即开中断