【发布时间】:2015-06-04 17:23:21
【问题描述】:
在我的大学项目中,我必须在 x86 汇编中使用浮点数的二进制表示来进行算术运算。禁止使用 FPU,所以我尝试读取浮点数并将其作为 DWORD 返回,但无论我尝试做什么,我都会得到“-nan”。有什么建议吗?
编辑: 我使用 gcc,它是 32 位代码
C 中的声明(我无法更改)
extern "C" float func(float num);
*.asm 文件
section .text
global func
func:
;prolog
push ebp
mov ebp, esp
; zapamiętanie rejestrów zachowywanych
push ebx
push esi
push edi
mov eax, DWORD [ebp+8]
;mov eax, 0xffffffff i checked that but i still get the same result
; odtworzenie rejestrów, które były zapamiętane
pop edi
pop esi
pop ebx
;epilog
pop ebp
ret
示例结果(针对 256)
01000011100000000000000000000000
11111111110000000000000000000000
num1: 256.000000
num2: -nan
编辑:
不检查位部分的C代码
#include <stdio.h>
extern "C" float func(float num);
int main()
{
float num1;
float num2;
scanf("%f", &num1);
num2=func(num1);
printf("num1: %f\nnum2: %f\n", num1, num2);
return 0;
}
【问题讨论】:
-
您使用的是哪个 C 编译器?
.asm扩展暗示了一些微软的变种,但我不能确定。这很重要,因为有多种调用约定;我不知道你的系统使用的是哪一个。 -
GCC on 64bit linux ubuntu
-
约定将浮点参数和返回值放在 SSE 寄存器中。在您的情况下,这意味着
num在xmm0中,这也是它应该返回的地方。 -
...但 .asm 代码显然是 32 位...
-
我的错。我应该告诉你我的程序必须是 32 位的(我使用 64 位 linux,但在这里没关系)