现在的位置: 首页 > 综合 > 正文

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

2018年02月19日 ⁄ 综合 ⁄ 共 1184字 ⁄ 字号 评论关闭

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


通常我们能够想到的函数参数有两种,一种是显示的定长参数,还有就是变长,这两种方式都有各自的捞取参数的方法,但是如果是定长参数却没有参数名该怎么办呢,这节我们就是要讨论一下这个问题,这个尽管在大多数情况下使用不上,但是有时候还是大有用武之地,改文也是为: 深入探讨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。

抱歉!评论已关闭.