gpt4 book ai didi

c - 访问汇编函数的浮点返回

转载 作者:太空狗 更新时间:2023-10-29 15:32:37 25 4
gpt4 key购买 nike

我们的类(class)练习要求我们在 GNU 汇编中创建一个 delta = b2 - 4ac 函数,并从 C 中访问它。由于这是一门关于编译器的类(class),而不是关于汇编的类(class),教授选择只演示整数功能,并且需要一个整数函数。

不过,我希望个人学习能够超出职责范围,并创建一个返回 float 而不是整数的可用函数。

我想到了这个 C(不要介意全局变量,下一个练习的目的是拥有一个带参数的正确函数):

# include <stdio.h>

extern float delta();
float a, b, c;

int main() {
a = 3;
b = 5;
c = 4;
printf("δ = %f\n", delta());
return 0;
}

和这个 GNU GAS:

.globl a
.globl b
.globl c
.globl delta
.f4: .float 4.0 # constante 4

.text
delta:
fld b # b sur la pile
fmul b # b2 sur la pile
fld .f4 # 4 sur la pile
fmul a # 4a sur la pile
fmul c # 4ac sur la pile
fsubp # b2 - 4ac sur la pile
ret

Google 让我相信我应该在浮点堆栈的顶部留下一个浮点结果,但是这是行不通的,在 C 调用程序中打印的结果总是 0.0000000。

我一定错过了一个非常小的东西,但是没有多少谷歌搜索能带来它,任何人都可以指出我正确的方向吗?感谢您的关注。

最佳答案

它对我有用。确保您没有意外使用 64 位模式,因为那里的调用约定不同。即使用gcc -g -m32 foo.c bar.s编译

也就是说,我也看到了一些应该解决的潜在问题。

  • 由于您的全局变量是在 C 代码中定义的,因此您不应在程序集中使用 .globl。如果有的话,您应该使用 .extern,但 GAS 不要求这样做。
  • 您不应依赖默认的操作数大小。当您有内存操作数时,您应该为 float 显式使用 s 后缀,为 double 使用 l 后缀。例如,flds b 以确保它作为 float 加载。
  • 你应该使用 fsubrp 因为堆栈的顶部是你的 4ac,所以你使用 fsubp 计算的是 4ac-b ^2.

关于c - 访问汇编函数的浮点返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26467147/

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