【发布时间】:2015-03-07 21:53:15
【问题描述】:
我正在尝试使用用 C 编写的 printTime() 函数来测试我的 32 位 NASM 程序的运行时间。
void printTime(float time){
printf("The cpu time is %e \n" , time);
}
这是 NASM 代码的一部分:
push edi <---------------- Here edi holds int 6580001
call printTime
pop edi
这里是GCC生成的汇编代码,我使用GDB跟踪每一步:
push ebp
mov esp, ebp
sub 0x8, esp
flds 0x8(esp) <------- x/d ($esp+0x8) gives me 6580001, the correct number
sub 0x4,esp
lea -0x8(esp),esp
fstpl (esp)
push 0x80486f6
call 0x8048370 <printf@plt> <--- it prints 9.220545e-39 here, which is wrong
add 0x10, esp
leave
ret
谁能告诉我为什么 printf 函数打印错误而不是 6.58001e+5 ?我很感激。
【问题讨论】:
-
好吧,你传递了一个 int 并且 printTime 需要一个浮点数。它们有不同的二进制表示。请参阅此处h-schmidt.net/FloatConverter/IEEE754.html 并输入 0x646721(您的十六进制数字)作为“十六进制表示”
-
@Roddy 嘿,非常感谢。