首页
社区
课程
招聘
[旧帖] [求助]过程参数和堆栈参数的关系 0.00雪花
发表于: 2010-5-4 13:31 1642

[旧帖] [求助]过程参数和堆栈参数的关系 0.00雪花

2010-5-4 13:31
1642
C语言程序调用汇编过程,并向其传送参数

test.c
#include<stdio.h>
extern int __stdcall myadd(int x, int y);

int main(void)
{
        int a=1, b=2,c=0;
        c=myadd(a,b);
        printf("c=%d\n", c);
        return 0;
}

1. 通过过程参数获得输入参数

myadd.asm

TITLE get the sum of the two numbers
.386
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE

.CODE
   myadd  PROC x:DWORD, y:DWORD
        MOV EAX, x
        ADD EAX, y
        RET       
   myadd  ENDP
END

2. 通过堆栈获得输入参数

TITLE get the sum of the two numbers
.386
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE

.CODE
   myadd  PROC USES ESI EDI x:DWORD, y:DWORD
        MOV EAX, [EBP+8]
        ADD EAX, [EBP+12]
        RET       
   myadd  ENDP
END

两种方法都对,但x与[EBP+8]  , y与[EBP+12], 是什么关系?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GUX
2
只分析2这种情况
2里面这个uses esi edi 表示要编译器自动插入保存及恢复这些寄存器的指令
翻译成完整的汇编代码就是
myadd proc x , y
push ebp
mov ebp, esp
push esi
push edi
.......
pop edi
pop esi
leave
ret
myadd endp

程序调用myadd的时候
push y
push x
call myadd     ; 这一句程序需要把返回地址压栈

所以[ebp+4]是返回地址
[ebp+8]是x
[ebp+12]是y
2010-5-4 15:13
0
雪    币: 76
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
你分析得我也明白,我就是不懂:过程名后的参数和堆栈参数什么关系?如果等价的话,为什么要有两种呢?
2010-5-4 15:48
0
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GUX
4
等价啊, 你把1用调试器反汇编看看就知道, 跟2其实是一样的
1是汇编编辑器中的写法, x,y只是助记符,经过汇编编译器编译后的代码, 其实就是2这样的
2010-5-4 16:38
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
为什么这些我老是不懂、、、、、、、
2010-5-4 16:42
0
雪    币: 76
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
嗯。就是C程序将参数传入到汇编的过程后,我不知道是操作输入参数好,还是堆栈参数好了。其实它们是一样的,都能获得输入参数。
谢谢大家了。
2010-5-4 17:33
0
游客
登录 | 注册 方可回帖
返回
//