Win-MASM64汇编语言-CALL/RET/RETF指令
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指令相关推荐
- 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
[0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...
- 汇编语言 Ret和retf指令
Ret和retf指令 Ret 用栈中的数据修改IP(近转移) Retf 用栈中数据修改cs:ip(远转移) Ret 执行过程 1(ip)=((ss)*16+(sp)) 2(sp)=(sp)+2 Ret ...
- 汇编:ret以及retf指令
执行ret指令,相当于执行pop ip 执行retf指令,相当于执行pop ip,pop cs assume cs:code, ds:data, ss:stack; 设置数据段 data segmen ...
- RET RETF IRET IRETD 指令的不同
文章目录 RET RETF (return far) IRET (interrupt return) IRETD 参考书籍 操作系统:32位,保护模式,非影子堆栈(Shadow-Stack) 填一下之 ...
- 汇编ret ,retf ,iret ,int指令详解
** ret指令 ** 执行过程 ret指令用栈中的数据,修改IP的值,从而实现近转移. CPU执行ret指令时,进行下面两步操作: (IP)=((SS)*16+(SP)) (SP)=(SP)+2; ...
- call、ret、retf 指令详解
call.ret.retf指令详解 本文讲解针对NASM编译器,8086处理器的call.ret.retf 指令.对于其他编译器和保护模式下的80x86,指令用法类似,可以作为参考. call指令 1 ...
- ret指令 和 retf指令
当执行ret指令时,相当于执行pop ip 当执行retf指令时,相当于先执行pop ip,后执行pop cs ret指令用栈中的数据,修改ip的内容,从而实现近转移: retf指令用栈中的数据,修改 ...
- 汇编语言基础--汇编操作指令概述
本文是接续"汇编语言基础--机器级数据存储",主要介绍汇编指令的构造.寻址和指令主要分类. 操作指令 指令的基本要素: 在"计算机处理器(CPU)基础&quo ...
- 8086汇编语言寻址方式、基本指令和调试指令
一.80x86/Pentium 各种寻址方式 1.立即寻址 立即寻址方式下,操作数作为立即数直接包含在指令中,紧跟在操作码之后与其一起 存放在代码段区域.因此,立即数总是和操作码一起被存入 CPU 的 ...
最新文章
- leetcode 448. Find All Numbers Disappeared in an Array
- python for-Python for windows官方版
- XML简介及基本语法
- 机器学习笔记(6) 线性回归
- 真希望永远用不到这些代码
- Ubuntu Server 18.04 与 MySQL 5.7
- OpenShift 4 - 部署运行 MinIO 对象存储
- (二)为AI时尚分类准备数据
- threejs 三面体_three.js几何体对象_三维建模_郭隆邦技术博客
- 京东零售2021年度表彰大会
- 生信过程中的各种文件格式
- cad画多段线时不显示轨迹_为什么CAD绘图编辑拖动时看不到预览效果?
- setsockopt()改善socket网络程序的健壮性
- 《python程序语言设计》第2章第15题几何正六边形面积。用def和class来完成
- 针对L型区域的椭圆方程的差分法
- java实现DSA签名、验签
- 数据库索引结构(方法),一张图搞懂MySQL索引
- 简单答题系统(判断题)
- 安卓免Root脚本精灵2.0.5
- 【英语面试常见问题集锦】
热门文章
- 计算机三级之嵌入式系统学习笔记8
- Activiti的ProcessEngine的基本配置
- linux getit文件乱码,winzipaes文件名乱码解决方案
- python文件写入乱码_python写文件打开后是乱码
- matlab求傅里叶级数展开式_明明学过积分和三角函数就能秒理解傅里叶变换.........
- 面向对象设计原则与设计模式
- PHP使用weui,微信小程序WeUI引入
- 字典树实现_【Leetcode每日打卡】单词的压缩编码 Trie(字典树)入门
- 利用for循环打印出不同的三角形
- ORACLE表空间使用量查询SQL