程序与处理器控制指令(六)


程序与处理器控制指令(六)

程序控制类指令本质是控制程序的执行方向
决定程序执行方向的因素:CS,IP
修改IP,改变程序在代码段中的执行顺序。
同时修改CS和IP,程序换另一个代码段执行
通过修改IP或CS和IP,实现程序的顺序,分支,循环结构
分类

  • 转移指令
  • 循环控制
  • 过程调用
  • 中断控制

转移指令

通过修改指令的偏移地址段地址和偏移地址是实现程序的转移。

  • 无条件转移指令
    • 无条件转移到目标指令
  • 条件转移指令
    • 当具备一定条件时(通常指状态标志位)转移到目标地址

无条件转移指令

可以实现段内或者段间的转移
格式
JMP OPRD
OPRD:目标地址

无条件段内转移

转移的目标地址在当前代码段内,段地址不改变,目标地址16位偏移地址。
段内直接转移:指令直接给出目标地址
段内间接转移:由寄存器或者存储器指出目标地址
例:

1
2
3
4
MOV BX,1200H
JMP BX

执行完后IP=1200H

无条件段间转移

转移的目标地址不在当前代码段内,目标地址是32位地址(16位偏移地址和16位段基地址)
段间直接转移:指令直接给出目标地址
段间间接转移:目标地址由指令中的32位操作数给出,32位目标地址存放于内存
例:

1
2
3
4
5
6
7
MOV SI,1122H
MOV WORD PTR[SI],0120H
ADD SI,2
MOV WORD PTR[SI],0122H
JMP DWORD PTR[SI-2]

执行完后IP=0120H,CS=0122H

条件转移指令

满足一定条件后,实现程序的转移。
条件转移指令均为段内短转移,转移范围为:-128至+127

循环控制指令

控制程序重复执行一段代码的指令,循环次数由CX寄存器决定
循环范围
以当前IP为中心的-128至+127范围内循环
指令
前一条指令为无条件循环指令,后面两条为条件循环指令

  • LOOP 循环条件:CX≠0
  • LOOPZ 循环条件:CX≠0,ZF=1
  • LOOPNZ 循环条件:CX≠0,ZF=0

过程调用指令

调用一个子程序,子程序执行结束后返回调用的指令的下一条指令,返回的地方称为断点
执行过程

  1. 将断点地址压入堆栈
  2. 获取程序第1条指令的地址
  3. 执行子程序
  4. 返回原程序

类型

  • 段内调用
    • 段内直接调用
    • 段内间接调用
  • 段间调用
    • 段间直接调用
    • 段间间接调用

段内调用

被调用程序和调用程序在同一代码段
格式
直接调用
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,中断标志位置位,即开中断


Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC