Ret 和 call 也是转移指令,可是他们跟jmp不同的是,这两个转移指令都跟栈有关系。

<1> ret

用栈中的数据改动IP的地址,从而实现近转移

( ip ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

相当于pop ip

<2>retf

用栈中的数据来改动CS以及IP的值,实现段间转移

( ip ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

( cs ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

相当于

Pop ip

Pop cs

<3> call xxx(行号)

先把当前IP压栈,然后跳转,相当于实现近转移

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( ip )

( ip ) = ( ip ) + 16位位移

相当于:

Push ip

Jmp near ptr xxx(行号)

<4>call far ptr

把CS。IP压栈处理,然后实现跳转,相当于段间转移。远转移

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( cs )

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( ip )

(cs) = 当前行号段地址

(ip) = 当前行号偏移地址

相当于:

Push cs

Push ip

Jmp far ptr xxx

<5> call reg(16bit)

跳转到16位寄存器上中存储的地址

( sp ) = (sp) – 2

( (SS)*16 + (sp) ) = (IP)

(IP) = ( 16bit Reg )

相当于:

Push IP

Jmp 16bit Reg

<6> call word ptr 内存单元地址

相当于

Push IP

Jmp word ptr 内存单元地址

如:call word ptr ds:[0]

<7> call dword ptr 内存单元地址

相当于

Push cs

Push ip

Jmp dword ptr 内存单元地址

比如:jmp dword ptr DS:[0];

<8>寄存器的冲突问题

主程序调用子程序段的时候,可能子程序会用到主程序中使用的寄存器的值。程序在设计的时候不可能做到不让子程序使用主程序的寄存器,由于两者是相互独立的。你永远不会还有一个会做什么。所以在子程序中採取不使用主程序中调用的寄存器的做法是不可行的。

解决方法:

把寄存器用到的东西,保存到堆栈里面。子程序调用完成。再将堆栈保存的东西弹出。

8086汇编之 CALL 和 RET指令的更多相关文章

  1. 汇编-10.0-CALL和RET指令

    call和ret指令都是转移指令,他们都是修改IP,或同时修改CS和IP.它们常被共同用来实现子程序设计. 1.ret和retf ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令 ...

  2. 王爽汇编第十章,call和ret指令

    目录 王爽汇编第十章,call和ret指令 call和ret指令概述: ret和retf ret指令 retf指令 call 和 ret 的配合使用 call指令详解 call原理 call指令所有写 ...

  3. 汇编学习笔记(7)call和ret指令

    ret和retf CPU执行ret指令时进行以下两步操作: (IP)=((ss)*16+(sp)) (sp)=(sp)+2 这相当于pop IP CPU执行retf指令时进行以下四步操作: (IP)= ...

  4. [汇编学习笔记][第十章 CALL和RET指令]

    第十章 CALL和RET指令 call和ret指令都是转移指令,它们都修改CS和IP.经常被共同用于实现子程序的设计.这一章,我们讲解call和ret指令的原理 10.1 ret和retf ret指令 ...

  5. 自己总结:汇编CALL和RET指令

    ret指令,相当于 pop IP:修改IP的内容,从而实现近转移 retf指令,相当于 pop IP pop CS:修改CS和IP的内容,从而实现远转移 -------------- CPU执行cal ...

  6. 汇编语言---call和ret指令

    汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈 ...

  7. 汇编中Enter与Leave指令

    Enter的作用相当==push ebp和mov ebp,esp 这后面两句大家很熟悉吧?函数开始一般都是这两句 Leave的作用相当==mov esp,ebp和pop ebp 而这后面这两句也很常见 ...

  8. call 和 ret 指令

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  9. 【8086汇编-Day1】预备知识

    菜鸟的8086汇编入门之旅,偶有错处恭请大佬们指正. Ⅰ· 闲说一下 我为什么学汇编?相对于晦涩难懂的01010101011010机器语言(高低电平变化驱动机器做出不同反应),汇编语言用更便于记忆和使 ...

随机推荐

  1. AE 打开工具箱工具的对话框

    The best approach to run a system tool—or any tool or model created, and saved in a toolbox from a b ...

  2. pm2 相关命令

    pm2 相关命令 转载 2017年02月18日 22:59:48   二.安装 Linux Binaries下载地址:https://nodejs.org/dist cd oneinstack/src ...

  3. Excel实现二级菜单联动

    项目中需要导入一个Excel模板需要实现二级联动,现记录如下: 首先看一下原始数据,原始信息在一张工作表,第一行是省市名称,下面的若干行为对应省市下面的地名和区名.需要在另外一张工作表中A列和B列建立 ...

  4. OpenShift 容器日志和应用日志分离问题

    一般来说应用日志和容器日志一样输出到console,这样oc logs的时候就能把所有的获取到,但这种模式下输出的日志比较多,问题定位不方便,更多的时候开发人员只想通过应用日志来查看定位问题就够了,所 ...

  5. MapReduce调度器

    1. 先进先出(FIFO)调度器 先进先出调度器是Hadoop的默认调度器.就像这个名字所隐含的那样,这种调度器就是用简单按照“先到先得”的算法来调度任务的.例如,作业A和作业B被先后提交.那么在执行 ...

  6. iOS:ASIHttpRequest虽不更新,但仍值得详细了解

    一.使用ASIHTTPRequest可以很方便的进行一下操作:同步/异步方式下载数据,定义下载队列,让队列中的任务按指定的并发数来下载(队列下载必须是异步的),提交表单,文件上传,处理cookie,设 ...

  7. RMAN备份与恢复总汇

    1.1  备份 1.1.1 对数据库进行全备 使用backup database命令执行备份 RMAN> BACKUP DATABASE; 执行上述命令后将对目标数据库中的所有数据文件进行备份, ...

  8. C++构造函数、析构函数、虚析构函数

    1.构造函数 C++中的构造函数是用于初始化类的各种变量以及分配资源等.主要的注意事项是: (1)在继承关系中先初始化父类对象后初始化子类对象. (2)在一个类中按照变量的声明顺序,对类中的变量进行初 ...

  9. (剑指Offer)面试题38:数字在排序数组中出现的次数

    题目: 统计一个数字在排序数组中出现的次数. 思路: 1.顺序遍历 顺序扫描一遍数组,统计该数字出现的次数. 时间复杂度:O(n) 2.二分查找 假设我们需要找的数字是k,那么就需要找到数组中的第一个 ...

  10. 主题 Theme 小结

    主题的使用 默认创建的Android工程中,在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme&qu ...