胡雪林
发送至 我, 西邮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) |