bevin 发表于 2011-8-17 09:00:38

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

.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 startlea 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指令)。。。。

javanetwork 发表于 2011-8-17 10:20:45

在函数调用过程中,栈从低到高是这样排列的:
其他的寄存器如ebx esi edi、当前程序预留的一段空间、父程序的ebp、call本程序的指令的下一条指令的ip、参数列表
在子程序开始,都会有push ebp,mov ebp,esp
就是将父程序的ebp入栈并将当前ebp指向父程序的ebp,
当前程序预留的一段空间:存放当前函数需要用到的一些局部变量
至于全局变量是放在静态存储区的,其空间在编译是已经分配好
参数列表:是在call 当前子程序之前,由父程序压栈的,压栈的可以是地址,也可以是数据
分别相当于C中的地址传递和值传递

bevin 发表于 2011-8-18 19:15:16

javanetwork 发表于 2011-8-17 10:20 static/image/common/back.gif
在函数调用过程中,栈从低到高是这样排列的:
其他的寄存器如ebx esi edi、当前程序预留的一段空间、父程序 ...

额,程序会自动识别它是值传递还是地址传递么,,,谢谢。。。。

javanetwork 发表于 2011-8-18 22:21:02

本帖最后由 javanetwork 于 2011-8-18 22:21 编辑

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

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

max(int a,int b),是值传递,push    push
汇编的[] 有点类似于C中的*

yangjian578 发表于 2011-8-19 10:48:58

页: [1]
查看完整版本: 汇编中的子程序是把参数的地址压入栈还是参数的值压入栈