gpt4 book ai didi

c - 使用汇编器和 C 接口(interface)执行多项操作

转载 作者:行者123 更新时间:2023-11-30 16:27:05 24 4
gpt4 key购买 nike

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

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

这是带有汇编接口(interface)的 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 的语法是否正确。如何将每个操作存储在堆栈位置然后打印结果?

最佳答案

嗯,我想我找到了。

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

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;
}

关于c - 使用汇编器和 C 接口(interface)执行多项操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52892697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com