【问题标题】:Perform several operations with an assembler and C interface使用汇编程序和 C 接口执行多项操作
【发布时间】:2018-10-19 12:50:05
【问题描述】:

我正在尝试在与 C 的接口内使用英特尔处理器的 FPU 单元的汇编程序执行不同的操作。 要执行的操作是:

43.001 * 0.00751
0.00000001 * 1.4142135623730951
0.1 + 0.1 + 0.1 − 0.3

这是带有汇编接口的 C 代码:

#include <stdio.h>

int main(void) 
{
double r;
double s;
const double a = 1;
const double b = 0.1;
const double c = 43.001; 
const double d = 0.00751;
const double e = 0.00000001; 
const double f = 1.4142135623730951;    
const double g = 0.3;   

__asm__ ("fldl %1;" //cargo a
        "fldl %2;"  //cargo b
        "fldl %3;"  //cargo c
        "fldl %4;"  //cargo d
        "faddp;"   // suma a con b y lo guarda en st(0)
        "fmul st2,st3" // c*d y lo guarda en st(2)
        "fstl %0;" : "=m" (r) : "m" (a), "m" (b)
        "fstl %1;" : "=m" (s) : "m" (c), "m" (d)    //acá creí que se se podia hacer la multiplicación
        );

printf("%.16e\n", r);
printf("%.16e\n", s);   
return 0;
}

这个想法是每个操作的结果都存储在堆栈位置,但我无法做到这一点,因为我不确定例如 fmul st2, st3 的语法是否正确。如何将每个操作存储在堆栈位置,然后打印结果?

【问题讨论】:

  • 没有这样的指令fmul st2,st3fmul 的操作数之一必须是 st0。同样,__asm__ 语句的语法似乎是错误的。通过内联汇编学习汇编是一个非常糟糕的主意。为什么不完全在汇编中编程而不是这样呢?

标签: c assembly intel fpu


【解决方案1】:

嗯,我想我找到了。

我编写的这段代码在独立的 asm 块中执行操作。

int main(void)
{
double result_mult1;
double result_mult2;
double result_resta;
const double a = 43.001;
const double b = 0.00751;
const double c = 0.00000001; 
const double d = 1.4142135623730951;
const double e = 0.1;
const double f = e+e+e;	
const double g = 0.3;

__asm__ ("fldl %1;" //Carga a
		 "fldl %2;"	//Carga b
		 "fmulp;"
		 "fstl %0;" : "=m" (result_mult1) : "m" (a), "m" (b) );
		 
__asm__ ("fldl %1;" //Carga c
		 "fldl %2;" //Carga d
		 "fmulp;"
		 "fstl %0;" : "=m" (result_mult2) : "m" (c), "m" (d) );
		 
__asm__("fldl %1;" //Carga g
		"fldl %2;" //Carga f
		"fsubp;"   //Resta g con f y lo guarda en st(0)
		"fstl %0;" : "=m" (result_resta) : "m" (g), "m" (f));	

printf("%.16e\n", result_mult1);
printf("%.16e\n", result_mult2);
printf("%.16e\n", result_resta);
return 0;
}

【讨论】:

  • 你仍然在 x87 堆栈上留下一些东西,因为你没有使用fstp。如果你反复这样做,你会因为溢出 x87 堆栈而得到 NaN。您的每个块都会在 2 次加载 + 一次弹出时多留下一个 x87 堆栈寄存器。
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多