鱼C论坛

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

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

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

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

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

x
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

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

.code
start:
lea eax,sztitle
lea ebx,szctent
invoke MessageBox,NULL,ebx,eax,MB_OK
invoke ExitProcess,NULL
end start
lea eax,sztitle
lea ebx,szctent这两句是实现把两个字符串的首地址给eax和ebx,invoke指令的功能相当于
push MB_OK
push eax
push ebx
push NULL
call MessageBox
是不是就是说win32中调用子程序时是把参数的地址压入栈中?为什么像MB_OK这中参数是直接值入栈,一直一点儿疑惑。。。希望大家指教。。。。

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

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

额,程序会自动识别它是值传递还是地址传递么,,,谢谢。。。。
想知道小甲鱼最近在做啥?请访问 -> 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中的*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
头像被屏蔽
发表于 2011-8-19 10:48:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 22:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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