uP:Srednie

Z Wiki Rafał (ert16) Trójniak

Spis treści

Temat zadania

Napisać program testujący (w C) oraz funkcję (w ASM) wyznaczającą wartości średniej arytmetycznej oraz średniej harmonicznej z n liczb zawartych w tablicy tab.

Deklaracja funkcji:

long compute_average(long tab[], int n, double *avg_a, double *avg_h) ;


Kody źródłowe

asm.s

.text
.type compute_average, @function
.global compute_average
#odp = compute_average(tablica, size, &avg_a, &avg_h)
 
compute_average:
	pushl %ebp
	movl %esp, %ebp
 
	movl 8(%ebp), %esi
	movl 12(%ebp), %ecx
 
	cmp $0, %ecx;
	jle fail;
 
	finit
#Inicjalizujemy zerem
	fldz
 
# Średnia arytmetyczna
#Dodajemy elementy z tablicy
addingLoop:
	fild (%esi)
	addl $4,%esi
	faddp
	loop addingLoop
 
# Sumę dzielimy przez ilość wartości
	fild 12(%ebp)
	fdivrp
 
# Odładamy wynik w odpowiednie miejsce
	movl 16(%ebp), %edi
	fstpl (%edi)
 
# Teraz zajmujemy sie średnią charmoniczną
	movl 8(%ebp), %esi
	movl 12(%ebp), %ecx
	fldz
 
#Dodajemy elementy z tablicy
addingCharmLoop:
	# Przygotowujemy stos i odwracamy pobraną z tablicy wartość
	fild (%esi)
	addl $4,%esi
	fld1
	fdivp
	# Dodajemy do poprzednioego wyniku
	faddp
	loop addingCharmLoop
 
# Sumę odwracamy mnorząd przez ilość wartości
	fild 12(%ebp)
	fdivp
# Składujemy wynik gdzie trzeba
	movl 20(%ebp), %edi
	fstpl (%edi)
 
	jmp finish
fail :
 
finish:
	movl %ebp, %esp
	popl %ebp
	ret

main.c

#include <stdio.h>
 
void compute_average(long tab[], int n, double *avg_a, double *avg_h) ;
 
int main()
{
	long tablica[] = 
		{1,2,3,4,5,6,7,8,9,10};
   	double	avg_a, avg_h;
	int size=sizeof(tablica)/sizeof(long);
	compute_average(tablica, size, &avg_a, &avg_h);
	printf("compute_average( [], %d, %f, %f)  \n",size, avg_a, avg_h);
	return 0;
}

Odpowiedź programu

compute_average( [], 10, 5.500000, 3.414172)
Osobiste