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