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)