社区
汇编语言
帖子详情
汇编子程序中如何返回结构?
kingyo
2004-05-13 01:36:35
我的汇编基础不是很好,现在想请教各位一个问题:汇编子程序中如何返回一个结构?
比如C语言里的一个函数 MYSTRUCT myfun();我调用这个函数:
MYSTRUCT tmp = myfun();
反汇编后,这个函数好像有了一个参数,是个指针。但是我不明白其中的道理。 请各位帮我一下。
谢谢。
...全文
156
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 和 Return 使用方法的
汇编
源代码
汇编
语言
子程序
调用
(1)将
子程序
的
返回
地址存放在连接寄存器LR
中
,同时将程序计数器PC指向
子程序
的入口点。(2)当
子程序
执行完毕需要
返回
调用处时,只需要将存放在LR
中
的
返回
地址重新复制给程序计数器PC即可。在ARM
汇编
语言程序
中
,
子程序
的调用一般是通过BL指令来实现的。在程序
中
,使用指令:BL+
子程序
名,即可完成
子程序
的调用。(3)在调用
子程序
的同时,也可以完成参数的传递和从
子程序
返回
运算的结果,通常可以使用寄存器R0~R3完成。不同编译器编译的代码间的相互调用,要遵循AAPCS(ARM Architecture)。
汇编
子程序
设计
汇编
之
子程序
设计 1.
子程序
的概念 1.1
子程序
的引入 在程序设计
中
,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的
子程序
结构
,以便在需要时调用。 1.2
子程序
和主程序
子程序
(过程):是指功能相对独立的一段程序。 主程序:调用
子程序
的程序称为主调程序或主程序。
子程序
与主程序的关系:调用与被调用的关系。 1.3
子程序
的优点
子程序
作为一个功能性模块,供一个程序甚至多个程序使用; 可以简化源程序
结构
; 提高程序的可读性与可
[ARM
汇编
]进阶篇—数据处理指令—2.2.3
子程序
调用和
返回
指令
子程序
调用和
返回
指令用于控制程序从一个位置跳转到
子程序
,执行
子程序
后再
返回
到跳转前的位置继续执行。在本节
中
,我们将详细介绍 ARM
汇编
中
的
子程序
调用和
返回
指令,并通过实例帮助你更好地理解和掌握这些指令。注意:在
子程序
中
可能会修改到一些寄存器的值,为了避免影响到调用处的状态,通常会在
子程序
开始时使用 PUSH 指令保存这些寄存器的值,然后在
子程序
结束之前使用 POP 指令恢复这些寄存器的值。在这个示例
中
,BX LR 指令用于从名为 func 的
子程序
返回
到调用处。
子程序
返回
指令用于从
子程序
返回
到调用处。
【
汇编
语言】
子程序
结构
子程序
结构
一、
子程序
指令 (1)
子程序
调用指令CALL 1.
子程序
调用指令CALL的功能 2.
子程序
调用指令CALL的使用方法 3.
子程序
调用指令CALL的分类 (2)
子程序
返回
指令RET (3)过程定义伪指令 二、参数传递 (1)寄存器传递参数 (2)共享变量传递参数 (3)堆栈传递参数
汇编语言
21,497
社区成员
41,618
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章