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

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

2010-5-4 13:31
1516
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], 是什么关系?

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

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