【发布时间】:2016-05-08 16:34:01
【问题描述】:
我正在尝试将我的 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;
}
和.asm程序:
avg PROC
finit
push BP
mov BP, SP
push bx
mov cx, [bp+4] ; no of elements
mov bx, [bp+8] ; address
fldz ; zero
jcxz avg_end ; if cx==0, end
iter:
fadd DWORD PTR [bx]
add bx, 4
loop iter
fidiv DWORD PTR [bp+4] ; sum/n
avg_end:
pop bx
pop BP
ret
avg ENDP
我的程序内部还有一个外部函数,它运行良好。
唯一的问题必须在avg PROC 代码中。我会很感激你的想法!
【问题讨论】:
-
bx为什么要加8?您确定您的环境中的float是8 个字节吗? -
你真的在写一个 16 位的 DOS 程序吗?如果有,为什么?
-
在 16 位环境中的参数之间使用偏移量 4 看起来也很奇怪。你确定它在你的 ABI 上吗?
-
哦,@MikeCAT。这是第一件事。你是对的。我猜应该是4。改变 - 它仍然没有给出正确的答案。但是,当然,谢谢。
-
(我怀疑问题是您将计算结果放在错误的位置,但不知道您意味着要使用什么 ABI,我可以'不能确定或提供更多帮助。)