zoukankan      html  css  js  c++  java
  • 函数-实现五个数相加(堆栈传参)

    一.什么是函数??

     例子:往寄存器中存值

    比如以下四个指令就可以说成一个函数

     二.调用一个函数

     

     例子 如果我们调用上面四个指令集合那个函数。

    jmp方法:jmp 00418403

       缺点 :一般不用jmp因为 调用完这个函数 程序还要接着执行,多次调用的时候容易出问题 。

    call方法:call 00418403(一般用此命令) 完事ret一下就好了 调用完成

    三.参数和返回值

    例子:编写一个函数,能够得到任意2个数相加的值

    第一步 ADD ECX,EDX(ECX+EDX完事结果放ECX里面)(写在4183FD)

    第二步 MOV EAX ,ECX (虽然寄存器都是通用的,但是往往他们有特殊的含义,而EAX是存放返回值的 所以要MOV一下 把结果放到EAX中)

    第三步 写一个RET 

    使用函数:

    MOV ECX,1 

    MOV EDX,2

    CALL 4183FD 

    例子:如果参数很多,有十个参数该怎么办?放寄存器里放不下 了,咋办呢?

    学一个方法就叫堆栈传参

    堆栈就是给当前程序使用的 操作系统已经分配好了

     思路就是把参数存到堆栈中,在函数里面就可以去堆栈里面将数取出来
    写法:(因为十个数太多 暂时就用5个数相加)

    第一步:堆栈传参数,先PUSH压栈 再CALL调用函数

    第二步:具体函数编写 

     解释一下 为什么是ESP+4   ESP+8...

    因为call执行完之后是会把它下一个地址压到堆栈中 但是所以这时候不能直接取ESP,这个时候的ESP是call指令下一行的地址。

    所以如何取到堆栈中的参数呢?直接ESP+4就行了

    堆栈的结构是这样的

     

     

  • 相关阅读:
    Castle 开发系列文章
    ASP.NET MVC 3 Release Candidate 发布喽
    Scott Hanselman on SpeakerWiki
    2010年上半年计算机软考软件设计师试卷参考答案
    一站式示例代码库2010年11月5日更新
    从数据到代码—基于T4的代码生成方式
    CodeDOM
    老吉优秀的数据库访问层代码(转)
    非关语言: 设计模式
    EntLib
  • 原文地址:https://www.cnblogs.com/cat47/p/12274940.html
Copyright © 2011-2022 走看看