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. CentOS,Fedora,Debian,Ubuntu,SuSE——我到底爱谁

    主观情绪上,一直都不是特别喜欢RedHat,虽然它是毋庸置疑的老大,其实我并不介意有人说我肤浅,说这话的理由简单,redhat.com发布RedHat 9(简写为RH9)后,不再开发RedHat 10 ...

  2. Appium+python自动化11-adb必知必会的几个指令

    前言 学android测试,adb是必学的,有几个常用的指令需要熟练掌握 一.检查设备 1.如何检查手机(或模拟器)是连上电脑的,在cmd输入: >adb devices

  3. JVM 图形化监控工具

    1.jvmstat        jvmstat是图形版的jstat,由Java 官方提供,目前最新版本为3.0. 下载地址:http://www.oracle.com/technetwork/jav ...

  4. Android开发之MdiaPlayer详解

    Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...

  5. 如何将js的object对象传到后台--->JavaScript之对象序列化

    一个问题:前台js如何传Object对象到后台哪 百度了半天,结果如下:只需要将object对象转化成json格式  然后传到后台  再在后台解析json字符串即可 那么问题来了: Object如何转 ...

  6. linux有用技巧:使用ntfs-3g挂载ntfs设备

    1.几种文件系统的比較 (1)在linux系统中支持一下文件系统:               Ext2         第二扩展文件系统(简称 ext2 或者 ext2) 非常多年前就已经成为 GN ...

  7. iOS网络编程解析协议二:XML数据传输解析

    XML两种解析方式,一种是SAX,NSXMLParser是SAX方法解析,另一种是DOM(Document Object Model); 区别: SAX: 只能读,不能修改,只能顺序访问,适合解析大型 ...

  8. OpenCV学习(11) 图像的腐蚀与膨胀(2)

    先对一副灰度图像进行腐蚀操作,然后在腐蚀后的图像上再进行膨胀操作,我们定义这个操作为开操作. 先对一副图像进行膨胀操作,然后在膨胀后的图像上再进行腐蚀操作,我们定义这个操作为闭操作.       开操 ...

  9. Converting a fisheye image into a panoramic, spherical or perspective projection [转]

    Converting a fisheye image into a panoramic, spherical or perspective projection Written by Paul Bou ...

  10. 字符编码(ASCII,Unicode和UTF-8) 和 大小端(zz)

    本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...