脑袋笨,看了很久才明白

书中有这样一道练习题,下面程序中,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指令的理解相关推荐

  1. call指令和ret指令【笔记+详解】

    笔记目录 call指令和ret指令[笔记] 1 引子 2 call和ret的简单运用 3 call指令本质含义详解 4 ret指令 5 总结及汇编环境资源 call指令和ret指令[笔记] 1 引子 ...

  2. 王爽老师汇编语言第四版第十章CALL和RET指令——小白笔记

    目录 10.1 ret和retf (1)  ret: (2)retf: 10.2 call指令 10.3依据位移进行转移的CALL指令 10.4 转移的目的地址在指令中的CALL指令 10.5转移地址 ...

  3. (十)汇编语言——CALL和RET指令

    (十)汇编语言--CALL和RET指令 文章目录 (十)汇编语言--CALL和RET指令 CALL指令 功能 寄存器 内存 段间转移 返回指令 ret retf 实例 MUL指令 模块化程序设计 寄存 ...

  4. CALL和RET指令(1)

    Call指令 作用:调用子程序 实质:流程转移 call指令实现转移得方法和jmp指令的原理相似 格式:call标号 CPU执行call指令,进行两步操作: (1)将当前的IP或CS和IP压入栈中 ( ...

  5. 关于IA-32过程调用和其中的push、leave、ret指令

    最近在复(yu)习(xi)<计算机系统基础>这门课程,发现了寄叽还是有很多问题.当时在学的时候没注意到的小细节,现在在这里展开说说,就当是一个记录寄叽学习的过程.我这个人理解能力不太行,我 ...

  6. call指令和ret指令的配合使用

    call指令和ret指令的配合使用 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846633.html

  7. Call指令和Ret指令讲解

    Call指令和Ret指令讲解 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846630.html

  8. 汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)

    指令周期 在执行一条指令的过程中,由CPU完成的操作序列构成一个指令周期,通常每一个指令周期一定会包含两个子周期:即取指令子周期和执行指令子周期.在取指令子周期,CPU将要执行的指令从内存中CS:IP ...

  9. 汇编语言笔记10-CALL和RET指令

    ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程序来解决一个复杂的问题. 子程序的框架 1 assume cs:code 2 ...

最新文章

  1. 工商银行:IT新架构及银行IT架构转型思考
  2. Dagger2 + MVP示例
  3. Rhel7/Centos7 修改运行级别
  4. JavaScript JSON操作
  5. SAP Spartacus User Form里checkbox的设计原理
  6. Nginx gzip参数详解及常见问题(已解决)
  7. java连接SqlServer2000类,比较完整,比较强大
  8. [系统安全] 十二.熊猫烧香病毒IDA和OD逆向分析(上)病毒初始化
  9. 如何升级iOS15,描述文件详细安装教程
  10. Altium Designer设计PCB总结(干货)
  11. 变量的三重属性_内存寻梦环游记:一个变量的三重死亡
  12. Linux -- 代理服务器(Squid Server)的配置与应用1
  13. 超好看的3D烟花代码
  14. 一文搞懂AWS EC2, IGW, RT, NAT, SG 基础篇下
  15. 灵活就业人员压力好大,不知道该不该继续交社保?
  16. 最简单的混合开发教程:APICloud.
  17. 腾讯御安全深度解析新型流量盗刷病毒家族
  18. Windows UAC提权
  19. 【Spring boot 项目实践】基于Spring boot 的外卖系统
  20. 魔百和E900V22C_905L3A(B)_5621DS-安卓9.0-纯净语音

热门文章

  1. Python-docx
  2. 亚马逊云计算服务二季度营收或超过80亿美元
  3. 还在着阶做子择时不试二阶
  4. 4张动图,桥式整流工作原理!
  5. 2017年计算机应用能力,2017年最新计算机应用能力考试试题
  6. Javaweb课后习题
  7. 太空射击 第06课: 子弹与碰撞处理
  8. java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerge
  9. 简述autocad在测绘工程中的应用_AutoCAD及测绘应用
  10. Three.js之GeoJson 3D地图数据可视化飞行线实战