C 浮点[]阵列的平均值(英特尔8086)

C 浮点[]阵列的平均值(英特尔8086),c,assembly,x86-16,tasm,C,Assembly,X86 16,Tasm,我正在尝试将我的ANSI C代码与ASM(确切地说是TASM)模块结合起来。 我决定选择经典的任务-获取数组中数字的平均值,它几乎可以正常工作,它可以成功编译和链接,但最后它说平均值等于-0(如果它不能) 我做错了什么?以下是我的.c代码所需的部分: #include <stdio.h> extern float avg(int, float*); int main() { int n = 2; float tab[] = {2.0, 3.0}; printf("%.3

我正在尝试将我的ANSI C代码与ASM(确切地说是TASM)模块结合起来。
我决定选择经典的任务-获取数组中数字的平均值,它几乎可以正常工作,它可以成功编译和链接,但最后它说平均值等于-0(如果它不能)

我做错了什么?以下是我的.c代码所需的部分:

#include <stdio.h>
extern float avg(int, float*);

int main()
{
  int n = 2;
  float tab[] = {2.0, 3.0};
  printf("%.3g\n", avg(n, tab));

  return 0;
}
我的程序内部还有一个外部函数,运行良好。

唯一的问题必须在
avg PROC
code内部。我很感激你的想法

在实地址模式中,指针不仅仅是偏移量。因此,要获取第二个参数float*,您需要:

lds bx, [bp+8]      ;full pointer
您可能希望
推送ds
/
弹出ds

第一个论点是德沃德吗?您可以尝试:

fidiv WORD PTR [bp+4] ; sum/n

在实地址模式中,指针不仅仅是偏移量。因此,要获取第二个参数float*,您需要:

lds bx, [bp+8]      ;full pointer
您可能希望
推送ds
/
弹出ds

第一个论点是德沃德吗?您可以尝试:

fidiv WORD PTR [bp+4] ; sum/n

为什么你从不从FP堆栈中弹出任何东西

在返回之前,您至少缺少一个最终的
fstp DWORD PTR[bp]
。ABI希望将返回值写入的位置


目前,您正在推送到FP堆栈,计算平均值,就这样。您泄漏了一个寄存器,从未查看结果。

为什么您从未从FP堆栈中弹出任何内容

在返回之前,您至少缺少一个最终的
fstp DWORD PTR[bp]
。ABI希望将返回值写入的位置


目前,您正在推送到FP堆栈,计算平均值,就这样。你泄露了一个注册表,从来没有查看结果。

我知道了。我似乎有两个问题:

  • 首先-寻址。
    bx
    寄存器应填写
    [bp+6]
    而不是
    [bp+8]

    这很明显,因为我的第一个参数是整数,2B长,不是吗

  • 除此之外,@Sep Roland对我的
    fidiv
    指令是正确的。
    我的价值观甚至不是德沃德,它只是一个词,它解决了我所有的问题

现在可以了,谢谢大家抽出时间。

我无法删除我的问题,所以我正在发布我的答案,也许有一天它会有用。

我知道了。我似乎有两个问题:

  • 首先-寻址。
    bx
    寄存器应填写
    [bp+6]
    而不是
    [bp+8]

    这很明显,因为我的第一个参数是整数,2B长,不是吗

  • 除此之外,@Sep Roland对我的
    fidiv
    指令是正确的。
    我的价值观甚至不是德沃德,它只是一个词,它解决了我所有的问题

现在可以了,谢谢大家抽出时间。

我无法删除我的问题,所以我正在发布我的答案,也许有一天它会有用。

为什么将8添加到
bx
?您确定您的环境中的
float
是8字节吗?您实际上是在编写16位DOS程序吗?若有,为什么?在16位环境中,在参数之间使用偏移量4看起来也很奇怪。你确定这是你的ABI吗?哦,米凯卡特。这是第一件事。你说得对。我想应该是4点。已更改-仍然无法给出正确答案。当然,谢谢。(我怀疑问题是你把计算结果放在了错误的地方,但我不知道你要用什么ABI,我不能肯定或者说没有更多的帮助。)为什么在
bx
中添加8?您确定您的环境中的
float
是8字节吗?您实际上是在编写16位DOS程序吗?若有,为什么?在16位环境中,在参数之间使用偏移量4看起来也很奇怪。你确定这是你的ABI吗?哦,米凯卡特。这是第一件事。你说得对。我想应该是4点。已更改-仍然无法给出正确答案。但是,当然谢谢。(我怀疑问题是您将计算结果放在了错误的位置,但是在不知道您要使用什么ABI的情况下,我无法确定或者提供更多帮助。)据我所知,如果我返回浮点值,结果应该放在FPU堆栈的顶部
st(0)
。不是这样吗?取决于编译器选择的ABI
hardfp
softfp
相比。后者在常规堆栈/寄存器上传递参数和返回值,前者推送并期望FP堆栈上的所有FP参数和返回值。只有在
cdecl
ABI中,
st(0)
用于返回。据我所知,如果我返回浮点值,结果应该放在FPU堆栈的顶部
st(0)
。不是这样吗?取决于编译器选择的ABI
hardfp
softfp
相比。后者在常规堆栈/寄存器上传递参数和返回值,前者推送并期望FP堆栈上的所有FP参数和返回值。只有在
cdecl
ABI中,
st(0)
用于返回。