鱼C论坛

 找回密码
 立即注册
查看: 4355|回复: 4

汇编中的子程序是把参数的地址压入栈还是参数的值压入栈

[复制链接]
发表于 2011-8-17 09:00:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. .386
  2. .model flat,stdcall
  3. option casemap:none

  4. include windows.inc
  5. include user32.inc
  6. includelib user32.lib
  7. include kernel32.inc
  8. includelib kernel32.lib

  9. .data
  10. sztitle db 'By Invoke!',0
  11. szctent db 'Hello,zerosoul!',0

  12. .code
  13. start:
  14. lea eax,sztitle
  15. lea ebx,szctent
  16. invoke MessageBox,NULL,ebx,eax,MB_OK
  17. invoke ExitProcess,NULL
  18. end start
复制代码
lea eax,sztitle
lea ebx,szctent这两句是实现把两个字符串的首地址给eax和ebx,invoke指令的功能相当于
  1. push MB_OK
  2. push eax
  3. push ebx
  4. push NULL
  5. call MessageBox
复制代码

是不是就是说win32中调用子程序时是把参数的地址压入栈中?为什么像MB_OK这中参数是直接值入栈,一直一点儿疑惑。。。希望大家指教。。。。

还有一个就是参数的形式,感觉在参数是全局变量和局部变量的使用方式有差异,具体也不怎么清楚,(addr,offset,lea指令)。。。。

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-8-17 10:20:45 | 显示全部楼层
在函数调用过程中,栈从低到高是这样排列的:
其他的寄存器如ebx esi edi、当前程序预留的一段空间、父程序的ebp、call本程序的指令的下一条指令的ip、参数列表
在子程序开始,都会有push ebp,mov ebp,esp
就是将父程序的ebp入栈并将当前ebp指向父程序的ebp,
当前程序预留的一段空间:存放当前函数需要用到的一些局部变量
至于全局变量是放在静态存储区的,其空间在编译是已经分配好
参数列表:是在call 当前子程序之前,由父程序压栈的,压栈的可以是地址,也可以是数据
分别相当于C中的地址传递和值传递
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-8-18 19:15:16 | 显示全部楼层

额,程序会自动识别它是值传递还是地址传递么,,,谢谢。。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-8-18 22:21:02 | 显示全部楼层
本帖最后由 javanetwork 于 2011-8-18 22:21 编辑

CPU没法识别是地址还是值,因为他们都是0和1,在CPU看来没什么区别
但是编译器会识别,会将源代码转变成不同的汇编指令
例如,

max(int *pa,int *pb)是地址传递,push pb  push pa

max(int a,int b),是值传递,push [pb]   push[pa]
汇编的[] 有点类似于C中的*
小甲鱼最新课程 -> https://ilovefishc.com
头像被屏蔽
发表于 2011-8-19 10:48:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 04:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表