我是靠谱客的博主 健康月饼,最近开发中收集的这篇文章主要介绍函数参数的获取:嵌入汇编的方法函数参数的获取:嵌入汇编的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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


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

最后

以上就是健康月饼为你收集整理的函数参数的获取:嵌入汇编的方法函数参数的获取:嵌入汇编的方法的全部内容,希望文章能够帮你解决函数参数的获取:嵌入汇编的方法函数参数的获取:嵌入汇编的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(113)

评论列表共有 0 条评论

立即
投稿
返回
顶部