码迷,mamicode.com
首页 > 其他好文 > 详细

函数参数的获取:嵌入汇编的方法

时间:2014-08-19 19:08:25      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:参数   传递本质   汇编   绕开规则   

函数参数的获取:嵌入汇编的方法


通常我们能够想到的函数参数有两种,一种是显示的定长参数,还有就是变长,这两种方式都有各自的捞取参数的方法,但是如果是定长参数却没有参数名该怎么办呢,这节我们就是要讨论一下这个问题,这个尽管在大多数情况下使用不上,但是有时候还是大有用武之地,改文也是为: 深入探讨this指针:从汇编的角度考虑做铺垫的。


该文测试环境:VS2010 (win7)  其他平台实现可能会不一样(汇编吗,毕竟不兼容)

案例:

有函数void  show(int*,char*),且参数没有名字,该如何在内部使用传入的参数呢?看下面代码:

案例一:

#include <stdio.h>
void show(int*,char*)
{
	int * id;
	char *w;  //使用word会造成与低层的命名冲突,这点要小心
	__asm  
	{  
		lea eax,id  
		mov edx,[ebp+8]
		mov [eax],edx  
		lea eax,w
		mov edx,[ebp+0xc]
		mov [eax],edx  
	}
	printf("id = %d\n",*id);
	printf("word = %s\n",w);
}

int main()
{
	int a = 10;
	char *str = "I am a str.";
	show(&a,str);
	getchar();
	return 0;
}
案例二:

#include <stdio.h>
void show(int*,char*)
{
	int * id;
	char *w;  //使用word会造成与低层的命名冲突,这点要小心
	char *none;
	__asm  
	{  
		lea eax,id  
		mov edx,[ebp+8]
		mov [eax],edx  
		lea eax,w
		mov edx,[ebp+0xc]
		mov [eax],edx 
		lea eax,none
		mov edx,[ebp+0x10]
		mov [eax],edx  
	}
	printf("id = %d\n",*id);
	printf("word = %s\n",w);
	printf("none = %s\n",none);
}
typedef void (*func)(int*,char*,char*);


int main()
{
	int a = 10;
	char *str = "I am a str.";
	char *pstr = "don't amazing,just a joke." ;
	func fc;
	fc = (func)show;
	fc(&a,str,pstr);
	getchar();
	return 0;
}

看到案例二的例子是不是很惊讶啊,怎么明明只有两个参数,却实际上传入了三个参数(亲测都通过,且正常运行)。

这就是函数传参的本质吧,不管你几个参数,我只按声明的类型传,且一般传几个收几个,只是你用不用的问题。

这里说明一下,这是windows下的汇编语言,在linux下可能不一样,实现细节也可能不同,但我相信大体思想应该是相同的。在这里,参数一般放在ebp寄存器中,第一个参数的入口地址为ebp+8。

函数参数的获取:嵌入汇编的方法,布布扣,bubuko.com

函数参数的获取:嵌入汇编的方法

标签:参数   传递本质   汇编   绕开规则   

原文地址:http://blog.csdn.net/liaoyoujinb/article/details/38684749

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!