【汇编】控制转移指令

文章目录

一、无条件转移指令 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 指令执行完,标志位由堆栈中取出的值确定
相关推荐
Code哈哈笑18 分钟前
【笔记】离散数学 1-3 章
笔记
大筒木老辈子3 小时前
Linux笔记---进程:进程替换
linux·服务器·笔记
不会聊天真君6473 小时前
爬虫(JAVA笔记第四十期)
java·笔记
吃着火锅x唱着歌5 小时前
PHP7内核剖析 学习笔记 第一章 PHP基础架构
笔记·学习·php
亦枫Leonlew8 小时前
三维测量与建模笔记 - 5.3 光束法平差(Bundle Adjustment)
笔记·计算机视觉·三维重建·光束法平差
Lbs_gemini06038 小时前
C++研发笔记14——C语言程序设计初阶学习笔记12
c语言·开发语言·c++·笔记·学习
MarisolHu9 小时前
前端学习笔记-Vue篇-02
前端·vue.js·笔记·学习
先知demons11 小时前
uniapp开发微信小程序笔记10-触底加载
前端·笔记·微信小程序·小程序·uni-app
B1nna11 小时前
外卖开发(三)开发笔记——AOP实现实现公共字段填充、主键回显、抛异常和事务管理
笔记
我的老子姓彭11 小时前
C++学习笔记
c++·笔记·学习