美文网首页
汇编- call和ret

汇编- call和ret

作者: Justin_901e | 来源:发表于2019-07-16 17:38 被阅读0次

尽管这两条指令看起来很简单,但是很多初学者并不能完全领会这两条指令的本质。所以我把它们作为一个单独的章节来介绍,我认为这样做是可取的。

Call指令是将转移到指定的子程序处,它的操作数就是给定的地址。例如:

Call 401362 表示将转移到地址401362处,将调用401362处的子程序,一旦子程序调用完毕就返回到Call指令的下一条语句处。

在这种情况下,完成401362的子程序调用以后,则会返回到40124A地址处。

call

我们这个子程序起始地址是401362,那么哪里是子程序的结束呢?这里我们下面第一个出现的ret指令就是子程序的结束。OD中还可以写成retn。执行完ret指令以后,程序就会返回到call指令的下一条指令40124A处。

子程序

为了让子程序执行完ret指令后,知道要返回到哪里,返回地址将要存到堆栈当中。这个程序可能包含了成千上万个堆栈操作(push,pop等),在堆栈中添加或者删除了各种各样的值,但是当我们执行到ret指令的时候,栈顶存放的一般是子程序的返回地址。我们一直按F8不跟进call指令里面,直到遇到了ret指令停止。

因此,我们可以知道ret指令是子程序的结束,也就是说,如果我们call跟进的话,那么ret就能返回到call指令的下一条语句处。我这里补充一点,ret指令可不仅仅用于子程序的返回,例如:

PUSH 401256

RET

这里将401256压入堆栈。下面的ret指令会将401256当做子程序的返回地址,其实它并不是返回地址,但是执行ret指令后我们依然可以转移到401256地址处。这段代码和JMP 401256指令的功能是一样的。

相关文章

  • 汇编- call和ret

    尽管这两条指令看起来很简单,但是很多初学者并不能完全领会这两条指令的本质。所以我把它们作为一个单独的章节来介绍,我...

  • 汇编语言知多少(三): 函数调用

    接着上一篇文章, 这篇主要讲汇编程序中函数的调用. call 和 ret 指令: 函数的调用. call 标号 :...

  • 汇编学习笔记(四)

    call和ret指令 call和ret都是转移指令,都修改IP,或同时修改CS和IP。 ret和retf ret ...

  • 8086汇编(17)call和ret

    call和ret指令 1、call标号 将下一条指令的偏移地址入栈后 转到标号处执行指令 2、 ret将栈顶的值出...

  • call和ret

    call指令和ret指令 call 标号:将下一条指令的偏移地址入栈后转到标号处执行指令 ret:将栈顶的值出栈,...

  • 汇编-8086 栈平衡,call和ret使用

    先上代码 开始分析 将在数据段中的字符串Hello!的位置push到栈中($:代表结束,offset在数据段的偏移...

  • 逆向 - 汇编 - 第四天

    Call 指令和 ret 指令 Call 指令:将下一条指令的偏移地址入栈;跳转到定位的地址, 执行指令; ret...

  • 【8086汇编】-- call 和 ret 指令 的应用和本质

    在高级语言开发中会把一些功能封装成方法然后调用,下面我们来用汇编实现一个打印hello world的方法 先实现打...

  • 汇编学习10 CALL与RET指令

    一、RET和RETF这两个指令都是转移指令,转移指令都是通过修改CS或者IP实现的跳转, 这两者也不例外。 RET...

  • call和ret指令

    1.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值。它们经常共同用语实现子程序的设...

网友评论

      本文标题:汇编- call和ret

      本文链接:https://www.haomeiwen.com/subject/xsgtlctx.html