CALL和RET都是转移指令,它们都会修改IP,或者同时修改CS和IP,两个指令配合使用用来实现子程序

一:RET与RETF
RET
将栈中的数据,放到IP中,从而实现修改IP,达到近转移
RETF
将栈中的数据,放到CS和IP中,从而实现修改CS和IP,达到远转移

注意ret与jmp的区别,jmp可以通过标号,内存,寄存器三种方式实现转移,而ret是通过栈来实现转移

由于是使用栈中的数据,所以执行RET或者RETF的时候,会触发出栈操作(等同于POP),在8086这种16位CPU下,执行RET的时候会有下面两步操作

将栈顶的两个字节弹出,放到IP寄存器中
(IP)=(SS*16+SP)
栈顶位置向下降2个字节
SP=SP+2

同理,执行RETF的时候,会执行下面四个步骤(只是多出了CS)

将栈顶的两个字节弹出,放到IP寄存器中
(IP)=(SS*16+SP)
栈顶位置向下降2个字节
SP=SP+2
将栈顶的两个字节弹出,放到CS寄存器中
(CS)=(SS*16+SP)
栈顶位置继续向下降2个字节
SP=SP+2

由此可见,在栈中如果存放CS和IP,那么IP是处于低地址,而CS是处于高地址的

注意:8086是16位结构,所以+2,32位CPU则是+4

下面的代码会让CPU从代码段10000的物理地址执行指令

mov ax,1000H
push ax
mov ax,0
push ax
retf

二:CALL
call指令会分两个步骤

1.将当前的ip或者cs/ip压入栈保存
2.转移

1.call 标号
下面的代码会将当前IP的值压入栈

call abc;此处会push ip
mov ax,0
abc mov bx,0

1.call far ptr 标号
下面的代码会将当前CS和IP的值压入栈

call far ptr abc;先push cs,再push ip,注意顺序
mov ax,0
abc mov bx,0

三.CALL和RET配合

简单总结就是一句话,CALL将当前执行位置暂存(入栈),执行完毕之后,RET从栈中取出数据,返回之前执行的位置

Win-MASM64汇编语言-CALL/RET/RETF指令相关推荐

  1. 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)

    [0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...

  2. 汇编语言 Ret和retf指令

    Ret和retf指令 Ret 用栈中的数据修改IP(近转移) Retf 用栈中数据修改cs:ip(远转移) Ret 执行过程 1(ip)=((ss)*16+(sp)) 2(sp)=(sp)+2 Ret ...

  3. 汇编:ret以及retf指令

    执行ret指令,相当于执行pop ip 执行retf指令,相当于执行pop ip,pop cs assume cs:code, ds:data, ss:stack; 设置数据段 data segmen ...

  4. RET RETF IRET IRETD 指令的不同

    文章目录 RET RETF (return far) IRET (interrupt return) IRETD 参考书籍 操作系统:32位,保护模式,非影子堆栈(Shadow-Stack) 填一下之 ...

  5. 汇编ret ,retf ,iret ,int指令详解

    ** ret指令 ** 执行过程 ret指令用栈中的数据,修改IP的值,从而实现近转移. CPU执行ret指令时,进行下面两步操作: (IP)=((SS)*16+(SP)) (SP)=(SP)+2; ...

  6. call、ret、retf 指令详解

    call.ret.retf指令详解 本文讲解针对NASM编译器,8086处理器的call.ret.retf 指令.对于其他编译器和保护模式下的80x86,指令用法类似,可以作为参考. call指令 1 ...

  7. ret指令 和 retf指令

    当执行ret指令时,相当于执行pop ip 当执行retf指令时,相当于先执行pop ip,后执行pop cs ret指令用栈中的数据,修改ip的内容,从而实现近转移: retf指令用栈中的数据,修改 ...

  8. 汇编语言基础--汇编操作指令概述

    本文是接续"汇编语言基础--机器级数据存储",主要介绍汇编指令的构造.寻址和指令主要分类. 操作指令 指令的基本要素:       在"计算机处理器(CPU)基础&quo ...

  9. 8086汇编语言寻址方式、基本指令和调试指令

    一.80x86/Pentium 各种寻址方式 1.立即寻址 立即寻址方式下,操作数作为立即数直接包含在指令中,紧跟在操作码之后与其一起 存放在代码段区域.因此,立即数总是和操作码一起被存入 CPU 的 ...

最新文章

  1. leetcode 448. Find All Numbers Disappeared in an Array
  2. python for-Python for windows官方版
  3. XML简介及基本语法
  4. 机器学习笔记(6) 线性回归
  5. 真希望永远用不到这些代码
  6. Ubuntu Server 18.04 与 MySQL 5.7
  7. OpenShift 4 - 部署运行 MinIO 对象存储
  8. (二)为AI时尚分类准备数据
  9. threejs 三面体_three.js几何体对象_三维建模_郭隆邦技术博客
  10. 京东零售2021年度表彰大会
  11. 生信过程中的各种文件格式
  12. cad画多段线时不显示轨迹_为什么CAD绘图编辑拖动时看不到预览效果?
  13. setsockopt()改善socket网络程序的健壮性
  14. 《python程序语言设计》第2章第15题几何正六边形面积。用def和class来完成
  15. 针对L型区域的椭圆方程的差分法
  16. java实现DSA签名、验签
  17. 数据库索引结构(方法),一张图搞懂MySQL索引
  18. 简单答题系统(判断题)
  19. 安卓免Root脚本精灵2.0.5
  20. 【英语面试常见问题集锦】

热门文章

  1. 计算机三级之嵌入式系统学习笔记8
  2. Activiti的ProcessEngine的基本配置
  3. linux getit文件乱码,winzipaes文件名乱码解决方案
  4. python文件写入乱码_python写文件打开后是乱码
  5. matlab求傅里叶级数展开式_明明学过积分和三角函数就能秒理解傅里叶变换.........
  6. 面向对象设计原则与设计模式
  7. PHP使用weui,微信小程序WeUI引入
  8. 字典树实现_【Leetcode每日打卡】单词的压缩编码 Trie(字典树)入门
  9. 利用for循环打印出不同的三角形
  10. ORACLE表空间使用量查询SQL