Chinaunix首页 | 论坛 | 博客
  • 博客访问: 822469
  • 博文数量: 92
  • 博客积分: 1498
  • 博客等级: 上尉
  • 技术积分: 993
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-18 18:31
文章分类

全部博文(92)

文章存档

2013年(2)

2012年(3)

2011年(3)

2010年(61)

2009年(23)

分类: LINUX

2010-07-26 17:03:30


查看之前的那片文章(传送门

胡雪林
 发送至 我, 西邮Linux兴趣小组, 王聪
还有一个问题:
  如果将float变量全部换成double型, 为啥没有出错????

Américo Wang
 发送至 胡雪林, 我, 西邮Linux兴趣小组
>还有一个问题:
>如果将float变量全部换成double型, 为啥没有出错????

把反汇编出来的add_float()函数贴出来。

胡雪林

源程序:
#include
int main()
{
float a = 1.2, b = 3.4;
add(a, b);
return 0;
}
void add(float a, float b)
{
printf("a = %f, b = %f, a + b = %f\n", a, b, a + b);
}

汇编代码:
.file "fpu.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl $0x3f99999a, %eax
movl %eax, 28(%esp)
movl $0x4059999a, %eax
movl %eax, 24(%esp)
flds 24(%esp)
flds 28(%esp)
fxch %st(1)
fstpl 8(%esp)
fstpl (%esp)
call add
movl $0, %eax
leave
ret
.size main, .-main
.section .rodata
.LC3:
.string "a = %f, b = %f, a + b = %f\n"
.text
.globl add
.type add, @function
add:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
flds 8(%ebp)
fadds 12(%ebp)
flds 12(%ebp)
flds 8(%ebp)
fxch %st(2)
movl $.LC3, %eax
fstpl 20(%esp)
fstpl 12(%esp)
fstpl 4(%esp)
movl %eax, (%esp)
call printf
leave
ret
.size add, .-add
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits


Américo Wang

>fxch %st(1)
>fstpl 8(%esp)
^^^^^^^^^^^^^^^^^ <====== 这里
>fstpl (%esp)
^^^^^^^^^^^^^^^^^ <====== 还有这里
>call add
>movl $0, %eax
>leave
>ret

很明显gcc把没有直接声明的函数add()的参数当成了double处理。

胡雪林
 发送至 Américo, 我, 西邮Linux兴趣小组

    很明显gcc把没有直接声明的函数add()的参数当成了double处理。

 
      如果把函数add()的参数当成了double处理,当给add()函数传递的参数是float型时,float会自动转换成 double型, 这样的话,数据的精度会更高,但数据不会出错吧。

Américo Wang
 发送至 胡雪林, 我, 西邮Linux兴趣小组
>> 很明显gcc把没有直接声明的函数add()的参数当成了double处理。
>>
>>
>      如果把函数add()的参数当成了double处理,当给add()函数传递的参数是float型时,float 会自动转换成double型,
>这样的话,数据的精度会更高,但数据不会出错吧。

你应该注意调用add()前的压栈操作和add()里面的出栈操作。
因为没有函数声明,所以gcc把add()的参数当double处理,并压栈。
而出栈时是float,这是由add()的定义决定的。
压栈和出栈不匹配,所以出错。
阅读(1623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~