【发布时间】:2015-07-31 01:37:18
【问题描述】:
我是汇编编程的新手,作为更大程序的一部分,我需要将浮点值传递给另一个 C 函数。我的测试程序调用了我的汇编函数,它只将参数推送到正确的堆栈上,并调用第二个 C 函数。
我的 C 测试函数:
extern void ext_func(char *result, double d); // C function
extern double tester(char *str, float d);
double a = tester(str, 3.14)
printf("%s\n", str); // Resulting in '0.000000'
// doing some fancy stuff with the float value and puts in result
ext_func(str, 3.14); // gives str = "3.140000"
x86,gcc -m32:
.globl tester
tester:
pushl %ebp # Standard
movl %esp, %ebp #
flds 12(%ebp) # Push second parameter on stack
pushl 8(%ebp)
call ext_func
addl $4, %esp
leave
ret
我认为当ext_funct 期待双倍时我只推 32 位存在问题。但我尝试了 fldl、fld1、fildl、fldl 12 和 16(%ebp),以及其他一些“乐趣”。
- 我的第一个问题是,ext_func 是否缺少浮点堆栈 (ST) 上的一些数据,因此无法生成浮点值?(我知道你没有被调用函数,但函数的作用无关紧要? )
- 其次,如果编译器需要浮点值,编译器是否总是转到 f 堆栈获取浮点值,或者是否可以从内存堆栈中读取它们?
- 第三,这里还有什么我遗漏的吗?如果我
printf("%f", a); //3.140000
printf("%f", str); //3.140000
但另一方面,a 给出了以 000000 结尾的大负数(100 位左右)。
【问题讨论】: