Ich versuche, meinen ANSI C-Code mit ASM (TASM, um genau zu sein) Modul zu kombinieren.
Ich entschied mich, die klassische Aufgabe zu wählen - Durchschnitt der Zahlen im Array zu bekommen, und es funktioniert fast, es kompiliert und verbindet erfolgreich, aber am Ende heißt es, dass der Durchschnitt gleich -0 ist (wenn nicht).Durchschnitt der float [] Array (Intel 8086)
Was habe ich falsch gemacht? Hier ist der benötigte Teil meines .c Code:
#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;
}
Und .asm Verfahren:
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
Mein Programm hat auch eine weitere externe Funktion innerhalb und es funktioniert gut.
Das einzige Problem muss innerhalb avg PROC
Code sein. Ich würde deine Ideen schätzen!
Warum 8 zu 'bx' hinzugefügt wird? Sind Sie sicher, dass "float" in Ihrer Umgebung 8 Bytes beträgt? – MikeCAT
Schreiben Sie tatsächlich ein 16-Bit-DOS-Programm? Wenn ja warum? – zwol
Verwenden von Offset 4 zwischen Argumenten in 16-Bit-Umgebung sieht auch seltsam aus. Sind Sie sicher, dass es entlang Ihrer ABI ist? – MikeCAT