【汇编】控制转移指令

文章目录

一、无条件转移指令 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位位移量

  1. 根据单个条件标志的设置情况转移

  2. 比较两个无符号数,根据比较结果转移

    适用于地址双精度数低位字的比较

  3. 比较两个带符号数,根据比较结果转移

    适用于带符号数的比较

举例 :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

执行的操作

  1. (CX) ← (CX)-1CX中存放循环次数
  2. 检查是否满足测试条件
    如满足则:(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 TYPEINT

  • 执行操作

    (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 指令执行完,标志位由堆栈中取出的值确定
相关推荐
宇寒风暖2 小时前
侯捷 C++ 课程学习笔记:内存管理与工具应用
c++·笔记·学习
云缘若仙2 小时前
directx12 3d+vs2022游戏开发第六章 笔记十一
笔记·directx12 3d
电棍2333 小时前
在wsl环境中配置和开发verilog(一种比较新颖的verilog开发指南)
笔记
非 白4 小时前
【Java】单例模式
java·笔记·单例模式
明阳mark4 小时前
Ansible 学习笔记
笔记·学习·ansible
StickToForever6 小时前
第4章 信息系统架构(六)
经验分享·笔记·学习·职场和发展
东方芷兰10 小时前
伯克利 CS61A 课堂笔记 11 —— Mutability
笔记·python
快下雨了L15 小时前
C++面试笔记(持续更新...)
笔记
柃歌16 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
JANGHIGH16 小时前
c++ std::list使用笔记
c++·笔记·list