函数参数的获取:嵌入汇编的方法
来源:互联网 发布:骑行软件 编辑:程序博客网 时间: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
- 函数参数的获取:嵌入汇编的方法
- stm32嵌入汇编的方法
- VC和VB嵌入汇编的方法
- VC程序中嵌入汇编的方法
- C嵌入汇编的编译链接方法
- 嵌入汇编的用法
- 获取函数参数arguments的方法
- 初学 Delphi 嵌入汇编[16] - 进制的表示方法
- C51下汇编的嵌入
- C51下汇编的嵌入
- php获取函数参数,获取类里面的方法名
- 获取方法的参数
- 用汇编的眼光看C++(之嵌入汇编) ,(之特殊函数)
- getopt()函数获取两个以上参数的方法
- Java获取函数参数名称的几种方法
- JavaScript获取参数的函数
- ARMLinux的C嵌入汇编语法
- PHP 获取参数的方法
- 体会棋盘游戏中的数据存储
- 黑马程序员 :交通灯系统的学习
- drupal自定义node权限
- Invalid location of tag 解决办法分析
- 扩展 OpenStack 的 REST API 的方法
- 函数参数的获取:嵌入汇编的方法
- 理解NS2中的OTcl/tclCL
- 利用PaceMaker+Qpid(持久化消息)+NFS的Qpid高可用配置
- 如何解决SQL Server内存不断增加问题
- Git中文教程
- spdofsound 340.29定义
- POJ3207——Ikki's Story IV - Panda's Trick
- Javascript面向对象编程(三):非构造函数的继承
- php 截取其它网站信息