[英]Average of float[] array (Intel 8086)
我試圖將我的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
代碼內部。 非常感謝您的想法!
在實地址模式下,指針將不只是偏移量。 因此,要獲取第二個參數float *,您將需要:
lds bx, [bp+8] ;full pointer
您可能需要push ds
/ pop ds
。
第一個參數甚至是雙字嗎? 您可以嘗試:
fidiv WORD PTR [bp+4] ; sum/n
為什么從不彈出FP堆棧中的任何內容?
在返回之前,您至少缺少最終的fstp DWORD PTR [bp]
。 無論您的ABI希望將返回值寫入哪個位置。
當前,您正在推入FP堆棧,計算平均值,僅此而已。 您泄露了一個寄存器,從沒有看過結果。
我知道了。 看來我有兩個問題:
首先-解決。
bx
寄存器應填充[bp+6]
而不是[bp+8]
。
這很明顯,因為我的第一個arg是2B長的整數,不是嗎?
除此之外, @ Sep Roland對我的fidiv
指令是正確的。
我的價值甚至不是DWORD,而是WORD,它解決了我所有的問題。
現在可以了,謝謝大家的時間。
我無法刪除我的問題,所以我要發布答案,也許有一天會有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.