【汇编】控制转移指令

文章目录

一、无条件转移指令 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 带符号数(-128127),无符号数(0255)

三、循环指令

类型

  • 循环指令 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 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
我在人间贩卖青春2 天前
汇编之伪指令
汇编·伪指令
starlaky2 天前
Django入门笔记
笔记·django
勇气要爆发2 天前
吴恩达《LangChain LLM 应用开发精读笔记》1-Introduction_介绍
笔记·langchain·吴恩达
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
勇气要爆发3 天前
吴恩达《LangChain LLM 应用开发精读笔记》2-Models, Prompts and Parsers 模型、提示和解析器
android·笔记·langchain
qianshanxue113 天前
计算机操作的一些笔记标题
笔记
土拨鼠烧电路3 天前
笔记11:数据中台:不是数据仓库,是业务能力复用的引擎
数据仓库·笔记
土拨鼠烧电路3 天前
笔记14:集成与架构:连接孤岛,构建敏捷响应能力
笔记·架构
烟花落o3 天前
栈和队列的知识点及代码
开发语言·数据结构·笔记·栈和队列·编程学习