设为首页 加入收藏

TOP

vc如何返回函数结果及压栈参数(三)
2014-11-23 17:34:43 来源: 作者: 【 】 浏览:48
Tags:如何 返回 函数 结果 参数
_big
_TEXT SEGMENT
_c$ = 8
_big$ = -8
_create_big PROC NEAR
; 27 : {
push ebp
mov ebp, esp
sub esp, 8
; 28 : big_t big = {c, 2006};
mov al, BYTE PTR _c$[ebp]
mov BYTE PTR _big$[ebp], al
mov DWORD PTR _big$[ebp+4], 2006 ; 000007d6H
; 29 : return big;
; 通过eax和edx返回 big
mov eax, DWORD PTR _big$[ebp]
mov edx, DWORD PTR _big$[ebp+4]
; 30 : }
mov esp, ebp
pop ebp
ret 0
_create_big ENDP
_TEXT ENDS
;call_big函数
PUBLIC _call_big
_TEXT SEGMENT
_big_obj$ = -8
_call_big PROC NEAR
; 33 : {
push ebp
mov ebp, esp
sub esp, 8
; 34 : big_t big_obj = create_big('A');
push 65 ; 00000041H
call _create_big
add esp, 4
; 通过eax和edx取得返回值
mov DWORD PTR _big_obj$[ebp], eax
mov DWORD PTR _big_obj$[ebp+4], edx
; 35 : }
mov esp, ebp
pop ebp
ret 0
_call_big ENDP
_TEXT ENDS
因为结构体大小与编译时的最大对齐模数选项有关(具体关系请参见《内存对齐与结构体的内存布局》),所以当最大对齐模数改变时返回动作将可能改变。对于本例,在编译时加上/Zp2选项,则big_t结构体类型大小为6字节,create_big函数也将相应地利用临时内存块而非edx寄存器来返回数据。
至于返回值为浮点类型则与整型和结构体型有相当的不同,因为IA32架构CPU有一套特殊的基于浮点寄存器栈操作的浮点指令集。浮点寄存器栈包括8个浮点寄存器,编号从0到7,其中0号为栈顶,7号为栈底,指令可通过编号访问相应寄存器,所有浮点运算的结果均保存在栈顶。取得浮点返回值很简单,只需直接弹出栈顶元素并拷贝到相应的变量中就可以了。我们通过下面这段小程序来验证一下。
double foo(double a)
{
return a + 10;
}
void goo()
{
double b;
b = foo(10.0);
}
; foo函数
PUBLIC _foo
PUBLIC __real@8@4002a000000000000000
EXTRN __fltused:NEAR
; COMDAT __real@8@4002a000000000000000
; File convention.c
CONST SEGMENT
__real@8@4002a000000000000000 DQ 04024000000000000r ; 10
CONST ENDS
_TEXT SEGMENT
_a$ = 8
_foo PROC NEAR
; 19 : {
push ebp
mov ebp, esp
; 20 : return a + 10;
; 从变量a中读入一个double型浮点数并压入浮点栈
fld QWORD PTR _a$[ebp]
; 将浮点栈的栈顶元素与10相加,将结果压入浮点栈
fadd QWORD PTR __real@8@4002a000000000000000
; 21 : }
pop ebp
ret 0
_foo ENDP
_TEXT ENDS
; goo函数
PUBLIC _goo
_TEXT SEGMENT
_b$ = -8
_goo PROC NEAR
; 24 : {
push ebp
mov ebp, esp
sub esp, 8
; 25 : double b;
; 26 : b = foo(10.0);
push 1076101120 ; 40240000H
push 0
call _foo
add esp, 8
; 将浮点栈顶元素弹出并存入变量b,此即保存foo函数返回值的动作
fstp QWORD PTR _b$[ebp]
; 27 : }
mov esp, ebp
pop ebp
ret 0
_goo ENDP
_TEXT ENDS
首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC常用数据类型使用转换详解 下一篇VC程序中Windows XP风格程序界面..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: