汇编子程序中如何返回结构?

kingyo 2004-05-13 01:36:35
我的汇编基础不是很好,现在想请教各位一个问题:汇编子程序中如何返回一个结构?
比如C语言里的一个函数 MYSTRUCT myfun();我调用这个函数:
MYSTRUCT tmp = myfun();
反汇编后,这个函数好像有了一个参数,是个指针。但是我不明白其中的道理。 请各位帮我一下。
谢谢。
...全文
155 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlyingSch 2004-05-14
  • 打赏
  • 举报
回复
已经说得很明白了,第一个参数
临时变量(MYSTRUCT 类型)的地址。
函数返回的EAX当然是临时变量的地址了
call fun (00401000) ;怎么变成三个参数了?
add esp,0Ch
mov ecx,dword ptr [eax];这里eax就是临时变量结构的地址
mov dword ptr [ebp-28h],ecx ;下面都不懂,隐约像是拷贝了两次。
mov edx,dword ptr [eax+4]
mov dword ptr [ebp-24h],edx
mov ecx,dword ptr [eax+8]
mov dword ptr [ebp-20h],ecx
mov edx,dword ptr [eax+0Ch]
mov dword ptr [ebp-1Ch],edx
//以上的代码翻译成C就变成sss=临时变量,再往下的代码就不知道是什么意思


kingyo 2004-05-13
  • 打赏
  • 举报
回复
MYSTRUCT sss = fun(a, b);//在这个语句之后,临时变量不再存在
对,这个我知道。

反汇编后,调用fun其实不是两个参数,而是三个参数,那么第一个参数是什么意思?这个函数返回的值EAX中的数是什么意思?

float& a=fn1(); //warning
这种简单数据类型的返回值是放在EAX中。
FlyingSch 2004-05-13
  • 打赏
  • 举报
回复
MYSTRUCT fun(int a, float b)
{
MYSTRUCT st;
st.a = a;
st.b = b;
st.c = a*b;
return st;
//对于返回操作,C++会执行以下的操作:
//创建一个临时变量并用st来初始化它
//用这个临时变量作来返回值
}

void main()
{
int a= 5;
float b = 4.0;
MYSTRUCT sss = fun(a, b);//在这个语句之后,临时变量不再存在
  
}

////////////////////////////////////////////////////
float fn1()
{
return 3.1;
}

void main
{
float& a=fn1(); //warning
}
kingyo 2004-05-13
  • 打赏
  • 举报
回复
我对这个调用时发生的内存分配,指针传递都不是很清楚。
不知道可以在哪里能找到这方面的资料??
kingyo 2004-05-13
  • 打赏
  • 举报
回复
我有一个子程序,返回一个结构,如下:
typedef struct
{
int a;
float b;
double c;
}MYSTRUCT;//本结构大小是10h

MYSTRUCT fun(int a, float b)
{
MYSTRUCT st;
st.a = a;
st.b = b;
st.c = a*b;
return st;
}

void main()
{
int a= 5;
float b = 4.0;
MYSTRUCT sss = fun(a, b);
}
可是我对在调用这个函数时的一些内存情况实在不明白,望高手指点!!
这是上面程序的反汇编。一些不明白的地方我都有标记。
//MYSTRUCT fun(int a, float b)
//{ 其实变成三个参数了吧?
push ebp
mov ebp,esp
sub esp,10h
//MYSTRUCT st;
//st.a = a;
mov eax,dword ptr [a]
mov dword ptr [st],eax
//st.b = b;
mov ecx,dword ptr [b]
mov dword ptr [ebp-0Ch],ecx
//st.c = a*b;
fild dword ptr [a]
fmul dword ptr [b]
fstp qword ptr [ebp-8]
//return st;
mov edx,dword ptr [ebp+8] ;edx中就是main中传递的指针吧?
mov eax,dword ptr [st]
mov dword ptr [edx],eax
mov ecx,dword ptr [ebp-0Ch]
mov dword ptr [edx+4],ecx
mov eax,dword ptr [ebp-8]
mov dword ptr [edx+8],eax
mov ecx,dword ptr [ebp-4]
mov dword ptr [edx+0Ch],ecx
mov eax,dword ptr [ebp+8];为何又返回这个main中传递来的指针呢?
//}
mov esp,ebp
pop ebp
ret
////////////////////////////////////////////////////////////////
//void main()
//{
push ebp
mov ebp,esp
sub esp,38h ;这句话在栈中留出空间,为何是38h,应该只有18h
//int a= 5;
mov dword ptr [a],5
//float b = 4.0;
mov dword ptr [b],40800000h
//MYSTRUCT sss = fun(a, b);
mov eax,dword ptr [b]
push eax
mov ecx,dword ptr [a]
push ecx
lea edx,[ebp-38h] ;这里是一个指针,指向什么?
push edx
call fun (00401000) ;怎么变成三个参数了?
add esp,0Ch
mov ecx,dword ptr [eax];这里eax中是不是就是ebp-38h?
mov dword ptr [ebp-28h],ecx ;下面都不懂,隐约像是拷贝了两次。
mov edx,dword ptr [eax+4]
mov dword ptr [ebp-24h],edx
mov ecx,dword ptr [eax+8]
mov dword ptr [ebp-20h],ecx
mov edx,dword ptr [eax+0Ch]
mov dword ptr [ebp-1Ch],edx
mov eax,dword ptr [ebp-28h]
mov dword ptr [sss],eax
mov ecx,dword ptr [ebp-24h]
mov dword ptr [ebp-14h],ecx
mov edx,dword ptr [ebp-20h]
mov dword ptr [ebp-10h],edx
mov eax,dword ptr [ebp-1Ch]
mov dword ptr [ebp-0Ch],eax
//}
mov esp,ebp
pop ebp
ret


紫郢剑侠 2004-05-13
  • 打赏
  • 举报
回复
就是传递结构的地址(也就是指向结构的指针).

看看WIN API函数的接口就可以理解了.

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧