关于ret指令的理解
脑袋笨,看了很久才明白
书中有这样一道练习题,下面程序中,ret指令执行后,(ip)=0,cs:ip指向代码的第一条指令
assume cs:code
stack segmentdb 16 dup(0)stack endscode segmentmov ax,4c00hint 21H
start:mov ax,stackmov ss,axmov sp,16mov ax,0push axmov bx,0ret
code endsend start
书中说,cpu执行完ret指令时,进行下面2步操作
(1)(ip)=((ss)*16+sp)
(2)(sp)=(sp)+2
因为看不懂,所以运行debug了下
然后照搬公式(1)(ip)=((ss)*16+sp),发现(ss)*16+sp=0bdf0+000e=0bdfe,怎么就得到0bdfe不等于0啊,怎么回事?原来0bdfe就是物理地址啊,(0bdfe)就是物理地址0bdfe指向的内容,我们用-d指令可以这样查看0bdf:e
可以看到该地址内容如图
0bdf:0000段中 0bdf:e对应00,然后0bdf:f对应剩下的00
所以这个时候ip指向的内容就是00
后来才明白,cpu执行ret其实不就是pop ip么?将此时sp指向的东东放到ip中,sp指向的东东也就是(ss)*16+sp这个地址中的数值啊!mov ax,0 push ax的作用就是将此时栈顶元素设置为0,然后执行push ip就是将ax抛出给ip了。
备注:
db 16 dup(1)
看下这个时候内存中是如何放置信息的
看到的都是16进制,所以01 中0占了4位,1也占了4位,恰好是8位,也就是一个字节
所以每2个紧挨一起的数字就占用了一个内存单元。
所以0bdf:0000指向的就是最开始的01
备注:关于mov sp,16,用图来理解
一开始的时候sp为0000,执行网mov ss,ax mov sp,16后,sp变为0010 *16也就相当于16进制1*16,所以变为0010,注意看,可以看到0bdf指向了另起一行的首地址,因为stack 在一开始的时候默认为16个字节,也就是0bdf:0-0bdf:f 所以sp变为0010也就是指向栈底了。
转载于:https://my.oschina.net/liangzhenghui/blog/143559
关于ret指令的理解相关推荐
- call指令和ret指令【笔记+详解】
笔记目录 call指令和ret指令[笔记] 1 引子 2 call和ret的简单运用 3 call指令本质含义详解 4 ret指令 5 总结及汇编环境资源 call指令和ret指令[笔记] 1 引子 ...
- 王爽老师汇编语言第四版第十章CALL和RET指令——小白笔记
目录 10.1 ret和retf (1) ret: (2)retf: 10.2 call指令 10.3依据位移进行转移的CALL指令 10.4 转移的目的地址在指令中的CALL指令 10.5转移地址 ...
- (十)汇编语言——CALL和RET指令
(十)汇编语言--CALL和RET指令 文章目录 (十)汇编语言--CALL和RET指令 CALL指令 功能 寄存器 内存 段间转移 返回指令 ret retf 实例 MUL指令 模块化程序设计 寄存 ...
- CALL和RET指令(1)
Call指令 作用:调用子程序 实质:流程转移 call指令实现转移得方法和jmp指令的原理相似 格式:call标号 CPU执行call指令,进行两步操作: (1)将当前的IP或CS和IP压入栈中 ( ...
- 关于IA-32过程调用和其中的push、leave、ret指令
最近在复(yu)习(xi)<计算机系统基础>这门课程,发现了寄叽还是有很多问题.当时在学的时候没注意到的小细节,现在在这里展开说说,就当是一个记录寄叽学习的过程.我这个人理解能力不太行,我 ...
- call指令和ret指令的配合使用
call指令和ret指令的配合使用 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846633.html
- Call指令和Ret指令讲解
Call指令和Ret指令讲解 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846630.html
- 汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)
指令周期 在执行一条指令的过程中,由CPU完成的操作序列构成一个指令周期,通常每一个指令周期一定会包含两个子周期:即取指令子周期和执行指令子周期.在取指令子周期,CPU将要执行的指令从内存中CS:IP ...
- 汇编语言笔记10-CALL和RET指令
☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程序来解决一个复杂的问题. 子程序的框架 1 assume cs:code 2 ...
最新文章
- 工商银行:IT新架构及银行IT架构转型思考
- Dagger2 + MVP示例
- Rhel7/Centos7 修改运行级别
- JavaScript JSON操作
- SAP Spartacus User Form里checkbox的设计原理
- Nginx gzip参数详解及常见问题(已解决)
- java连接SqlServer2000类,比较完整,比较强大
- [系统安全] 十二.熊猫烧香病毒IDA和OD逆向分析(上)病毒初始化
- 如何升级iOS15,描述文件详细安装教程
- Altium Designer设计PCB总结(干货)
- 变量的三重属性_内存寻梦环游记:一个变量的三重死亡
- Linux -- 代理服务器(Squid Server)的配置与应用1
- 超好看的3D烟花代码
- 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下
- 灵活就业人员压力好大,不知道该不该继续交社保?
- 最简单的混合开发教程:APICloud.
- 腾讯御安全深度解析新型流量盗刷病毒家族
- Windows UAC提权
- 【Spring boot 项目实践】基于Spring boot 的外卖系统
- 魔百和E900V22C_905L3A(B)_5621DS-安卓9.0-纯净语音
热门文章
- Python-docx
- 亚马逊云计算服务二季度营收或超过80亿美元
- 还在着阶做子择时不试二阶
- 4张动图,桥式整流工作原理!
- 2017年计算机应用能力,2017年最新计算机应用能力考试试题
- Javaweb课后习题
- 太空射击 第06课: 子弹与碰撞处理
- java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerge
- 简述autocad在测绘工程中的应用_AutoCAD及测绘应用
- Three.js之GeoJson 3D地图数据可视化飞行线实战