社区
汇编语言
帖子详情
汇编子程序中如何返回结构?
kingyo
2004-05-13 01:36:35
我的汇编基础不是很好,现在想请教各位一个问题:汇编子程序中如何返回一个结构?
比如C语言里的一个函数 MYSTRUCT myfun();我调用这个函数:
MYSTRUCT tmp = myfun();
反汇编后,这个函数好像有了一个参数,是个指针。但是我不明白其中的道理。 请各位帮我一下。
谢谢。
...全文
155
6
打赏
收藏
汇编子程序中如何返回结构?
我的汇编基础不是很好,现在想请教各位一个问题:汇编子程序中如何返回一个结构? 比如C语言里的一个函数 MYSTRUCT myfun();我调用这个函数: MYSTRUCT tmp = myfun(); 反汇编后,这个函数好像有了一个参数,是个指针。但是我不明白其中的道理。 请各位帮我一下。 谢谢。
复制链接
扫一扫
分享
转发到动态
举报
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函数的接口就可以理解了.
Call 和 Return 使用
当我们在
汇编
语言
中
遇到一个"Call"指令时,程序员实际上是将程序的执行流转移至另一个预先定义好的
子程序
或函数。这个
子程序
通常会执行特定的任务,例如执行复杂的计算、处理数据或者进行某种逻辑操作。"Call"指令...
汇编
语言
子程序
调用
(1)将
子程序
的
返回
地址存放在...(3)在调用
子程序
的同时,也可以完成参数的传递和从
子程序
返回
运算的结果,通常可以使用寄存器R0~R3完成。不同编译器编译的代码间的相互调用,要遵循AAPCS(ARM Architecture)。
汇编
子程序
设计
汇编
之
子程序
设计 1.
子程序
的概念 1.1
子程序
的引入 在程序设计
中
,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的
子程序
结构
,以便在...
[ARM
汇编
]进阶篇—数据处理指令—2.2.3
子程序
调用和
返回
指令
子程序
调用和
返回
指令用于控制程序从一个位置跳转到
子程序
,执行
子程序
后再
返回
到跳转前的位置继续执行。...在这个示例
中
,BX LR 指令用于从名为 func 的
子程序
返回
到调用处。
子程序
返回
指令用于从
子程序
返回
到调用处。
【
汇编
语言】
子程序
结构
子程序
结构
一、
子程序
指令 (1)
子程序
调用指令CALL 1.
子程序
调用指令CALL的功能 ...(2)
子程序
返回
指令RET (3)过程定义伪指令 二、参数传递 (1)寄存器传递参数 (2)共享变量传递参数 (3)堆栈传递参数
汇编语言
21,497
社区成员
41,616
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章