返回

微机原理笔记03-指令系统

指令系统基本概念

指令

  • 是指人向计算机发出的并且能够被计算机所识别的一种命令,它用来控制(要求)计算机做一些具体的事情。
  • 这里所说的指令是面向机器的指令,它和具体的CPU是密切相关的,这意味着,对于不同的CPU,它所能够识别的指令是不完全一样的。一个CPU所能够识别的指令是有限的。
  • 一条指令应包含的三点信息:
    • 运算数据的来源
    • 运算结果的去向
    • 执行的操作

指令系统

  • 一种CPU所能够识别的所有指令集和称为指令系统
  • 同一系列机的指令是向前兼容的
    • 8086指令集在后续InterCPU指令集中仍可用

指令格式

$$操作码\quad[操作数],[操作数]$$

  • 操作码:执行何种操作
  • 操作数(地址码):指令执行的对象
    • []:表示可选项,可以为空
    • 第一个操作数:目标操作数
    • 第二个操作数:源操作数
    • 操作数表示了参加操作的数据或数据存放的地址

按照操作数的个数可将指令分为:

  • 零操作数指令:操作码

    • 操作对象是隐式的
  • 单操作数指令:操作码 操作数

  • 双操作数指令:操作码 [操作数] , [操作数]

  • 多操作数指令:三操作数及以上

指令中的操作数

  • 立即数:
    • 由指令直接给出,是常数性质
    • 无地址含义,只表示运算的数据,不能作为目标操作数
  • 寄存器操作数
    • 表示运算的数据存放在寄存器中
    • 多数情况下,寄存器操作数指通用寄存器
    • 在三类操作数中所需运行时间最短
  • 存储器操作数
    • 表示运算的数据存放在内存
    • 指令中[ ]里是数据所在单元的偏移地址
    • 在三类操作数中所需运行时间最长。

8088/8086是16位CPU,指令操作数可以是8位或16位

【例】存储器操作数

  • 存储器操作数传输单元个数取决于另一个操作数的大小
  • 图中第一条指令的目标操作数是AL,是一个8位寄存器,所以传输一个内存地址,将内存单元1200H中数据22H存入8位寄存器AL中
  • 图中第二条指令的目标操作数是AX,是一个16位寄存器,所以传输两个内存,单元将内存单元1200H中数据22H存入16位寄存器的低8位,将内存单元1201H中数据11H存入16位寄存器的高8位

寻址方式

寻址方式:寻找操作数所在地址的方法

  • 源操作数
    • 运算数据的来源
  • 目标操作数
    • 运算结果的去向
    • 另一个运算数据

操作数可能的来源或运算结果可能的去处:

  • 由指令直接给出
  • 寄存器
  • 内存单元

寻找操作数所在地址的方法可以有四种大类型 :

  • 指令直接给出的方式
    • 运算对象由指令直接给出
  • 存放于寄存器中的寻址方式
    • 参加运算的数据存放在CPU的某个通用寄存器中
  • 存放于存储器中的寻址方式
    • 指令操作的对象在内存中,表现形式为:[ ]
    • 指令中给出运算对象在内存某个逻辑段中的偏移地址:[偏移地址]
    • 逻辑段的段基地址通过默认或重设方式给出。
    • 存储器操作数的字长本身不确定,其字长取决于指令中另一个寄存器操作数,或通过其他方式指定字长
  • 隐含给出方式

立即寻址

寄存器寻址

直接寻址

寄存器间接寻址

寄存器相对寻址

  • 相对寻址主要用于一维数组的操作
  • 常将位移量作为“表头”地址,间址寄存器的值作为表内相对地址

基址、变址寻址

基址、变址、相对寻址

隐含寻址

小结

例题

数据传送指令

说明:以下为8086CPU的指令集

通用数据传送指令

一般数据传送指令MOV⭐

  • 格式:MOV dest, src
  • 操作:src → dest
  • 注意点:
    • 两操作数字长必须相同
    • 两操作数不允许同时为存储器操作数
    • 两操作数不允许同时为段寄存器
    • 源操作数立即数时,目标操作数不能段寄存器
    • IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现。

【例】判断下列指令的正确性:

堆栈操作指令⭐

堆栈操作的原则

  • 先进后出
  • 以字为单位:16位机中,字长是16位
压栈指令PUSH
  • 格式:PUSH OPRD

  • 说明:

    • OPRD:16位寄存器或存储器的两个单元
  • 执行过程:

    • SP - 2 → SP:栈顶指针SP向上移动,腾出两个字节的空间
    • 操作数高字节 → SP+1:操作数高字节数据存入栈顶指针SP指向的下一个单元
    • 操作数低字节 → SP:操作数低字节数据存入栈顶指针SP指向的单元
  • PUSHFD 指令把 FLAGS 寄存器内容压入栈顶单元
  • PUSHAD 指令按照 EAX、ECX、EDX、EBX、ESP(执行 PUSHAD 之前的值)、EBP、ESI 和 EDI 的顺序,将所有 32 位通用寄存器压入堆栈
出栈指令POP
  • 格式: POP OPRD
  • 执行过程:
    • 操作数低字节 → SP:弹出SP指向的单元内容
    • 操作数高字节 → SP + 1:栈顶指针向下移动一个单元,弹出SP指向的单元内容
    • SP + 2 → SP:栈顶指针向下移动一个单元,指向当前栈顶

注意

  • 堆栈中栈底是高地址,栈顶是低地址
  • 指令的操作数必须是16位;
  • 操作数可以是寄存器或存储器,但不能是立即数
  • 不能从栈顶弹出一个字给CS;
  • PUSH和POP指令在程序中一般成对出现;
  • PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。
  • POPFD 指令则把栈顶单元内容弹出到 FLAGS 寄存器
  • POPAD 指令按照相反顺序将同样的寄存器弹出堆栈

交换指令XCHG⭐

  • 格式:
    • XCHG REG,MEM/REG
  • 注:
    • 两操作数必须有一个是寄存器操作数
    • 不允许使用段寄存器。
  • 例:
    • XCHG AX,BX
    • XCHG [2000],C

查表转换指令XLAT

  • 格式:
    • XLAT
  • 说明:
    • 用BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得 到要查找元素的偏移地址
  • 操作:
    • 将BX+AL所指单元的内容送AL

字位扩展指令CBW、CWD

  • 将符号数的符号位扩展到高位;

  • 指令为零操作数指令,采用隐含寻址,隐含的操作数为 AX及AX,DX

  • 无符号数的扩展规则为在高位补0

字节到字的扩展指令

  • 格式:
    • CBW
  • 操作:
    • 将AL内容扩展到AX
  • 规则:
    • 若最高位=1,则执行后AH=FFH
    • 若最高位=0,则执行后AH=00H

字到双字的扩展指令

  • 格式:
    • CWD
  • 操作:
    • 将AX内容扩展到DX AX
  • 规则:
    • 若最高位=1,则执行后DX=FFFFH
    • 若最高位=0,则执行后DX=0000H

输入输出指令IN、OUT

  • I/O端口:I/O接口中用于存储数据、可以直接被CPU访问的寄存器
  • 计算机输入输出系统中可以包含若干接口控制电路(芯片),每个接口中都包含了1个或多个端口

指令寻址方式

  • 根据端口地址码的长度,指令具有两种不同的端口地址表现形式。
  • 直接寻址
    • 端口地址为8位时,指令中直接给出8位端口地址;
    • 寻址256个端口。
  • 间接寻址
    • 端口地址为16位时,指令中的端口地址必须由DX指定;
    • 可寻址64K个端口。

【例】IO指令

地址传送指令LEA

  • 操作:
    • 将变量的偏移地址写入到目标寄存器
  • 当程序中用符号表示内存偏移地址时,须使用该指令。
  • 格式:
    • LEA REG,MEM
  • 指令要求:
    • 源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。

标志传送指令

  • 隐含操作数AH

    • LAHF(Load AH from Flags)
      • 指令格式:
        • LAHF
      • 操作:将FLAGS的低8位装入AH
    • SAHF(Store AH into Flags)
  • 隐含操作数FLAGS

    • PUSHF(Push flags onto stack)
    • POPF(Pop flags off stack)

算术运算指令⭐

加法运算指令

普通加法指令ADD

  • 格式:
    • ADD OPRD1,OPRD2
  • 操作:
    • OPRD1 + OPRD2 → OPRD1

【例】ADD指令的执行,对全部6个状态标志位都产生影响:

带进位位的加法指令ADC

  • 指令格式、对操作数的要求、对标志位的影响与ADD 指令完全一样
  • 指令的操作:
    • OPRD1 + OPRD2 + CF → OPRD1
  • ADC指令多用于多字节数相加,使用前要先将CF清零

加1指令INC

  • 格式:
    • INC OPRD
  • 操作:
    • OPRD+1 → OPRD
  • 说明:OPRD不能是段寄存器不能是立即数
  • 常用于在程序中修改地址指针

减法运算指令

普通减法指令SUB

  • 格式:
    • SUB OPRD1,OPRD2
  • 操作:
    • OPRD1 - OPRD2 → OPRD1
  • 对标志位的影响与ADD指令相同

考虑借位的减法指令SBB

  • 指令格式、对操作数的要求、对标志位的影响与SUB 指令完全一样
  • 指令的操作:
    • OPRD1 - OPRD2 - CF → OPRD

减1指令DEC

  • 格式:
    • DEC OPRD
  • 操作:
    • OPRD - 1 → OPRD
  • 指令对操作数的要求与INC相同,指令常用于在程序中修改计数值

比较指令CMP

  • 格式:
    • CMP OPRD1,OPRD2
  • 操作:
    • OPRD1- OPRD2
    • 指令执行的结果不影响目标操作数,仅影响标志位
  • 用途:
    • 用于比较两个数的大小,可作为条件转移指令转移的条件
  • 指令对操作数的要求及对标志位的影响与SUB指令相同
  • 两个无符号数的比较:
    • CMP AX,BX
    • 若 AX ≥ BX → CF=0
    • 若 AX < BX → CF=1
    • 若 AX = BX → CF=0,ZF=1
  • 两个带符号数的比较:
    • CMP AX,BX
    • 两个数的大小由OF和SF共同决定
    • OF和SF状态相同 AX ≥ BX
    • OF和SF状态不同 AX < BX

详细分析:

  • OF=1,SF=1,AX - BX有溢出,AX - BX < 0不成立,AX - BX ≥ 0,AX ≥ BX
  • OF=0,SF=0,AX - BX无溢出,AX - BX ≥ 0成立,AX ≥ BX
  • OF=1,SF=0,AX - BX有溢出,AX - BX ≥ 0不成立,AX - BX < 0,AX < BX
  • OF=0,SF=1,AX - BX无溢出,AX - BX < 0成立,AX < BX

求补指令NEG

  • 格式:
    • NEG OPRD
  • 操作:
    • 0 - OPRD → OPRD
  • 说明:
    • OPRD是8/16位寄存器或存储器操作数
    • 对一个负数取补码就相当于用零减去此数
    • 执行NEG指令后,一般情况下都会使CF为1,除非给定的操作数为零才会使CF为0;
    • 当指定的操作数的值为80H(-128)或为8000H(-32768),则执行NEG指令后,结果不变,但OF置1,其它情况下OF均置0
    • 用0减去操作数,可以得到负数的绝对值

乘法指令

乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX

无符号的乘法指令MUL

  • 格式:
    • MUL OPRD
  • 说明:OPRD不能是立即数
  • 操作:
    • OPRD为字节数 → AL × OPRD → AX
    • OPRD为16位数 → AX × OPRD → DXAX

带符号的乘法指令IMUL

  • 格式:
    • IMUL OPRD
  • 指令格式及对操作数的要求与MUL指令相同。
  • 指令执行原理:
    • 将两个操作数取补码(对负数按位取反加1,正数不变);
    • 做乘法运算;
    • 将乘积按位取反加1。

除法指令

无符号除法指令DIV

  • 格式:
    • DIV OPRD

有符号除法指令IDIV

  • 格式:
    • IDIV OPRD

注意:除法指令要求被除数是除数的双倍字长

若OPRD是字节数

  • 执行:AX / OPRD
  • 结果:
    • AL=商;AH=余数

若OPRD是双字节数

  • 执行: DXAX / OPRD
  • 结果:
    • AX=商;DX=余数

小结

  • 算术运算类指令的执行会影响状态标志位。其中:
    • INC和DEC指令的执行不会影响CF
  • 算术运算类指令中所有单操作数指令都要求操作数:
    • 不能是立即数
    • 如果是存储器操作数,需要声明操作数的字长(用PTR运算符)
  • 乘法运算中:乘积是乘数的双倍字长
  • 除法运算中:要求被除数是除数的双倍字长

逻辑运算指令⭐

  • 对操作数的要求:
    • 大多与MOV指令相同。
    • “非”运算指令要求操作数不能是立即数;
  • 对标志位的影响
    • 除“非”运算指令,其余指令的执行都会影响除AF 外的5个状态标志;
    • 无论执行结果任何,都会使标志位OF=CF=0
    • “非”运算指令的执行不影响标志位。

与指令AND

  • 格式:
    • AND OPRD1,OPRD2
  • 操作:
    • 两操作数相“与”,结果送目标地址。
  • 应用:
    • 实现两操作数按位相与的运算
      • AND BL,[SI]
    • 使目标操作数的某些位不变,某些位清零
      • AND AL,0FH
    • 在操作数不变的情况下使CF和OF清零
      • AND AX,AX

或指令OR

  • 格式:
    • OR OPRD1,OPRD2
  • 操作:
    • 两操作数相“或”,结果送目标地址
  • 应用:
    • 实现两操作数相“或”的运算
      • OR AX,[DI]
    • 使某些位不变,某些位置“1”
      • OR CL,0FH
    • 在不改变操作数的情况下使OF=CF=0
      • OR AX,AX

非指令NOT

  • 格式:
    • NOT OPRD
  • 操作:
    • 操作数按位取反再送回原地址
  • 注:
    • 指令的执行对标志位无影响
  • 例:
    • NOT BYTE PTR[BX]

异或运算指令XOR

  • 格式:
    • XOR OPRD1,OPRD2
  • 操作:
    • 两操作数相“异或”,结果送目标地址
  • 例:
    • XOR BL,80H
    • XOR AX,AX——寄存器清零

测试指令TEST

  • 格式:
    • TEST OPRD1,OPRD2
  • 操作:
    • 执行“”运算,但运算的结果不送回目标地址
  • 应用:
    • 常用于测试某些位的状态

移位操作指令

定点数移位运算:传送门

移位操作指令:控制二进制位向左或向右移动的指令,可分为两类:

  • 非循环移位指令
  • 循环移位指令

指令格式在形式上为双操作数,本质上为单操作数;

指令的目标操作数为被移动对象,源操作数为移动次数

  • 当目标为存储器操作数时,需要说明其字长
  • 源操作数只能是1或CL

移动移动1位时由指令直接给出;移动两位及以上时,移位次数必须由CL指定。

循环移位指令的应用:

  • 用于对某些位状态的测试;
  • 高位部分和低位部分的交换;
  • 与非循环移位指令一起组成32位或更长字长数的移位。

非循环算术左移指令SAL

用于有符号数

  • SAL OPRD , 1
  • SAL OPRD ,CL

非循环逻辑左移指令SHL

用于无符号数

  • SHL OPRD,1
  • SHL OPRD,CL

非循环算术右移指令SAR

用于有符号数

  • SAR OPRD,1
  • SAR OPRD,CL

非循环逻辑右移指令SHR

用于无符号数

  • SHR OPRD,1
  • SHR OPRD,CL

不带进位位的循环移位ROL、ROR

带进位位的循环移位RCL、RCR

串操作指令⭐

串操作指令说明

  • 针对数据块字符串的操作
  • 可实现存储器存储器的数据传送;
  • 待操作的数据串称为源串,目标地址称为目标串
  • 串操作指令的操作对象是多个字节数(一串字符或数据), 因此,指令的执行需要确定:
    • 串所在的区域
    • 串的首地址(原串、目标串起始地址)
    • 串长度(大小)
    • 串的操作方向

串操作指令的要求

  • 串所在区域及首地址:

    • 源串一般存放在数据段,偏移地址由SI指定。允许段重设
    • 目标串必须在附加段,偏移地址由DI指定
  • 串长度:

    • 串长度值由CX指定
    • 通过增加重复前缀,可以实现对CX值的自动修改
  • 串的操作方向:

    • 由DF标志位决定。指令根据DF状态自动修改地址指针
      • DF=0 → 增地址方向
      • DF=1 → 减地址方向
  • 若按增地址方向操作,串操作结束时:

    • 串传送指令:指针将指向串尾+1
    • 串比较类指令:指针将指向结束位+1
  • 若按减地址方向操作,串操作结束时:

    • 串传送指令:指针将指向串尾-1
    • 串比较类指令:指针将指向结束位-1

重复前缀

  • 无条件重复
    • REP
      • 若CX≠0,则REP后的指令将继续重复执行
      • 常用于传送类指令前 → 未传送完则继续传送
  • 条件重复
    • 相等(为零)重复:REPE(REPZ)
      • CX ≠ 0 ∩ ZF = 1,则前缀后的指令将继续重复执行
    • 不相等(不为零)重复:REPNE(REPNZ)
      • CX ≠ 0 ∩ ZF = 0,则前缀后的指令将继续重复执行
    • 条件前缀常用于运算类指令前,当:
      • 操作未结束 AND 结果=0
      • 操作未结束 AND 结果≠0
    • 使其后的指令继续重复执行

串传送指令MOVS

  • 功能:
    • 将源数据串传送到目标地址
  • 格式:
    • MOVS OPRD1,OPRD2 → 此格式仅用于源操作数需段重设的情况下
    • MOVSB → 按字节传送
    • MOVSW → 按字传送
  • 串传送指令常与无条件重复前缀连用

【例】串传送指令

串比较指令CMPS

  • 功能:
    • 用于实现两个数据串的比较
  • 操作:
    • 目标串-源串,结果不写回目标地址
    • 常与条件重复前缀连用
  • 格式:
    • CMPS OPRD1,OPRD2
    • CMPSB
    • CMPSW
  • 前缀的操作对标志位不影响

【例】串比较指令

串扫描指令SCAS

常用于在指定存储区域中寻找某个关键字

  • 格式:
    • SCAS OPRD
    • SCASB
    • SCASW
  • 执行与CMPS指令相似的操作,区别是:
    • 这里的源操作数是AX或AL

【例】串扫描指令应用

在ES段中从2000H单元开始存放了10个字符,寻找其中有无字符“A”。若有则记下搜索次数,将搜索次数写入到DATA1单元,并将存放“A”的地址写入DATA2单元。

串装入指令LODS

  • 格式:
    • LODS OPRD
    • LODSB
    • LODSW
  • 操作:
    • 对字节: AL ← [DS:SI]
    • 对字:AX ← [DS:SI]
  • 应用
    • 用于将内存某个区域的数据串依次装入累加器,以便显示或输出到接口。
    • LODS指令一般不加重复前缀。

串送存指令STOS

  • 格式:
    • STOS OPRD
    • STOSB
    • STOSW
  • 操作:
    • 对字节:AL → [ES:DI]
    • 对字: AX → [ES:DI]
  • 应用:
    • 常用于将内存某个区域置同样的值
    • 此时:
      • 将待送存的数据放入AL(字节数)或AX(字数据);
      • 确定操作方向(增地址/减地址)和区域大小(串长度值);
      • 使用串存储指令+无条件重复前缀,实现数据传送。

串操作指令应用注意事项

  • 需要定义附加段
    • 目标操作数必须在附加段
  • 需要设置数据的操作方向
    • 确定DF的状态
  • 源串和目标串指针分别为SI和DI
  • 串长度值必须由CX给出
  • 注意重复前缀的使用方法
    • 传送类指令前加无条件重复前缀
    • 串比较类指令前加条件重复前缀,但前缀不影响ZF状态

程序控制指令⭐

  • 程序控制类指令以“隐含”的方式修改CS和IP ,以实现控制程序走向的目的(Intel指令集不允许由指令直接修改CS 和IP)
  • 通过修改IP或CS和IP,实现程序的三种基本控制结构
    • 顺序,选择(分支),循环
  • 学习程序控制类指令需要重点关注:
    • 如何实现对CS和IP的修改

转移指令JMP

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

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

无条件转移指令

段内转移
  • 下一条要执行指令的偏移地址=当前IP+位移量
  • 段内直接转移
    • 转移的目标地址由指令直接给出
    • 格式:
      • JMP Label
  • 段内间接转移
    • 转移的目标地址存放在某个16位寄存器或存储器的某两个单元中
    • 例:
      • MOV BX,1200H
      • JMP BX
    • 执行完上述指令后:
      • IP=1200H
段间转移
  • 段间直接转移
    • 转移的目标地址由指令直接给出
    • 格式:
      • JMP FAR Label
  • 段间间接寻址
    • 转移的目标地址由指令中的32位操作数给出
    • 32位目标地址须存放于内存中
    • 例:
      • JMP DWORD PTR[BX]

条件转移指令JC等

  • 在满足一定条件下,程序转移到目标地址继续执行
  • 条件转移指令均为段内短转移,即转移范围为:
    • -128 —— +127

  • 基于1个标志位状态实现转移的指令
    • JC/JNC
      • 判断CF的状态。常用于两个无符号数大小比较
    • JZ/JNZ
      • 判断ZF的状态。常用于循环体的结束判断
    • JO/JNO
      • 判断OF的状态。常用于有符号数溢出的判断
    • JP/JPE
      • 判断PF的状态。用于判断运算结果低8位中1的个数是否为偶数
    • JS /JNS
      • 判断SF的状态。常用于判断数的性质
  • 基于2个或3个标志位状态实现转移的指令:
    • JA/JAE/JB/JBE
      • 判断CF或CF+ZF的状态。常用于无符号数大小的比较
    • JG/JGE/JL/JLE
      • 判断SF+OF或SF+OF+ZF的状态。常用于有符号数大小的比较
  • 基于CX内容转移的指令
    • JCXZ
      • 可根据指令执行后CX的结果实现转移

【例】转移指令

循环控制

  • 循环范围:
    • 以当前IP为中心的-128~+127范围内循环
    • 循环次数由CX寄存器指定
  • 循环指令:
    • LOOP → 无条件循环指令
    • LOOPZ → 条件循环指令
    • LOOPNZ → 条件循环指令

无条件循环指令LOOP

  • 格式:
    • LOOP LABEL
  • 循环条件:
    • CX ≠ 0
  • 操作:
    • 重复执行一块语句,执行的次数是特定的,CX被自动用做计数器,在每次循环之后减1
    • 完全相当于:
      • DEC CX
      • JNZ 符号地址

条件循环指令LOOPZ、LOOPNZ

  • 功能:
    • 先使CX-1,再根据CX中的值及ZF值来决定是否继续循环
  • 格式:
    • LOOPZ Label → 继续循环的条件:CX≠0,且ZF=1
    • LOOPNZ Label → 继续循环的条件:CX≠0,且ZF=0

【例】

过程调用指令CALL

  • 过程调用指令
    • 用于调用一个子过程
  • 与转移指令的比较
    • 子过程执行结束后要返回原调用处

调用指令的执行过程

  • 保护断点
    • 将调用指令的下一条指令的地址(断点)压入堆栈
  • 获取子过程的入口地址
    • 子过程第1条指令的偏移地址
  • 执行子过程
    • 功能实现,参数的保存及恢复
  • 恢复断点,返回原程序。
    • 将断点偏移地址由堆栈弹出

段内调用

【例】段内调用

段间调用

  • 子过程与原调用程序不在同一代码段 , 调用前需保护断点的段基地址和偏移地址
  • 先将断点的CS压栈,再压入IP

【例】段间调用

返回指令RET

  • 功能:
    • 从堆栈中弹出断点地址,返回原程序
  • 格式:
    • RET
  • 子程序的最后一条指令必须是RET

中断控制

  • 中断的概念
    • 某种异常或随机事件使处理器暂时停止正在运行的程序,转去执行一段特殊处理程序,并在处理结束后返回原程序被中断处继续执行的过程。
  • 中断指令:
    • 引起CPU产生一次中断的指令
  • 中断与过程调用
    • 相似点:
      • 从一个正在执行的过程转向另一个过程(处理程序),并在执行完后返回原程序继续执行
    • 区别:
      • 中断是随机事件或异常事件引起,调用是事先已在程序中安排好;
      • 调用指令在指令中直接给出子程序入口地址,中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。
      • 调用可以是近过程调用或远过程调用,中断处理程序均为远过程;
      • 响应中断请求不仅要保护断点地址,还要保护FLAGS内容。

中断指令INT

中断指令的执行过程:

  • 将FLAGS压入堆栈;
  • 将INT指令的下一条指令的CS、IP压栈;
  • 由n×4得到存放中断向量的地址;
  • 将中断向量(中断服务程序入口地址)送CS和IP寄存器;
  • 转入中断服务程序。

【例】中断指令

中断返回指令IRET

  • 格式:
    • IRET
  • 中断服务程序的最后一条指令,负责:
    • 恢复断点
    • 恢复标志寄存器内容

处理器控制指令

  • 这类指令用来对CPU进行控制,如修改标志寄存器,使CPU暂停,使CPU与外部设备同步等。
    • 对标志位的操作
    • 与外部设备的同步
  • 处理器控制指令的控制对象是CPU
  • 均为零操作数格式指令
Built with Hugo
Theme Stack designed by Jimmy