簡體   English   中英

float []數組的平均值(英特爾8086)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM