call命令和ret命令来实现子模块调用

来源:互联网 发布:java自定义注解的作用 编辑:程序博客网 时间:2024/05/16 10:58

      说到子模块调用,感觉有点抽象,简单说就是函数调用,从function1中调用function2的功能,如果用高级语言来实现很容易,相信每个有过编程经验的人也都很明白,那么汇编是怎么实现的呢?这就用到了call 命令,和ret命令;

     从字面意思来理解,call 可以直观理解为调用,call function,也就是调用某个函数,那么ret命令呢,我觉得应该是return的简写,意思是返回,为啥叫返回,我们举个例子:

    int  main()

     {

                printf(sth.....);

                 fuction1();//调用函数

                printf(sth);

      }

  

   function1()

   {

       do sth........

       return ;

   }

大家可以看到,function1的执行,我们就认为是call命令操作,当function1执行完毕以后,我们还想继续往下执行main函数的下一行代码,如果不从函数中跳转回来是不行的,这就是return的必须了,有人说我们有的是void,不用返回啊? 这里有个误区,void不是不返回,而是不返回任何数据类型,每一个函数都要返回他的入口地址,也就是调用函数的代码所在内存地址,这样cpu才能顺利的执行call函数之后的代码。

         由此来说的话,其实call 和ret 就完成了汇编语言中的函数调用功能,是不是很简单呢? 当然高级语言可能没有类似的指令,但其函数思想是完全一致的,不管是面向对象还是面向过程,我们其实面向的都是数据类型的入口地址,在多个地址之间来回跳转腾挪,完成比较复杂的业务逻辑。 经过这些,我觉得基本的汇编调用 ,很多人应该是理解的了,水平有限,权当抛砖引玉,本人在进行深一步的研究。

原创粉丝点击