【发布时间】:2016-06-09 15:40:51
【问题描述】:
如何在汇编程序中返回 64 位值? 我试过这个:
C 程序:
#include <stdio.h>
double result=0;
double a = 10;
extern double func(double a);
int main() {
result = func(a);
printf("result: %f\n", result);
return 0;
}
组装:
section .bss
x: resq 1
section .text
global func
func:
movq qword[x],xmm0
fld qword [x]
fld qword [x]
fadd
movq xmm0,qword[x]
ret
它应该返回 20.0 但它始终是 10.0 我做错了什么?
【问题讨论】:
-
您永远不会存储结果。顺便说一句,使用 SSE 而不是 x87 可能更简单。
-
Elderbug 是正确的。
fadd添加了 st(0) 和 st(1),将值存储在st(0)中。您不会使用堆栈顶部的值更新 [x] 中的值。您也不要在返回之前从 FPU 堆栈中弹出额外的值(如果您调用此函数 5 次,这将导致 FPU 堆栈溢出问题)。正如 Elder 指出的那样,除非给定的任务要求您这样做,否则您可以使用 SSE 而不是 FPU。 -
代码也可以简化,但我很好奇你是编译32位还是64位代码?我从你得到的结果中假设,你的可执行文件是 64 位的。
-
如果您可以使用 SSE,您可以使用 ADDSD 指令,例如
section .text; global func; func: addsd xmm0, xmm0; ret。这会将 xmm0 中的双精度标量添加到 xmm0 中,并将结果存储在 xmm0 中。 -
@PeterCordes :是的,我的主要观点是一种间接的方式来暗示它总是有助于告诉我们问题中的目标环境。不太可能,但可以通过使用
-fno-leading-underscore之类的东西来避免 Win32 的 GCC 上的下划线。我非常怀疑他是,但一切皆有可能。