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

来源:互联网 发布:骑行软件 编辑:程序博客网 时间:2024/06/04 18:46

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


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

0 0
原创粉丝点击