%include "rw32-2018.inc" section .rodata ; Retezce pro vypis small_str db "Perioda kyvadla pro male oscilace: ", 0 full_str db "Opravene reseni: ", 0 unit_str db " s", EOL, 0 ; Vstupni hodnoty length dd 1.0 theta dd 20.0 g dd 9.807 ; Ostatni konstanty precision dd 1e-6 section .text CMAIN: ; Inicializace FPU jednotky, rezim zaokrouhlovani a maska vyjimek finit ; Zavolani vypoctu periody pro male hodnoty theta fld dword [length] ; FPU stack: { [length] } call PendulumPeriod0 ; FPU stack: { T0 } ; Vypis vysledku mov esi, small_str call WriteString call WriteDouble mov esi, unit_str call WriteString ; Ukol 4: Doplnte vypocet a vypis presnejsi aproximace ; Algoritmus: st(0) / ( M(1.0, cos([theta] / 2.0) ) ; Nacteni uhlu a prevedeni na radiany ; Vypocet prvniho parametru "cos([theta] / 2.0)" na vrchol zasobniku ; Umisteni druheho parametru ; Vypocet aritmeticko-geometrickeho prumeru ; Podeleni periody T0 ziskanym prumerem M(...) ; Vypis opravene hodnoty ; Zahozeni posledni hodnoty ze zasobniku ffree st0 ; FPU stack: -- ; Navrat z funkce xor eax, eax ret ; Ukol 1: Napiste funkci ktera pocita aproximaci periody kyvadla pro male pocatecni vychylky ; Vstup: Delka ramena kyvadla l [m], st(0) ; Vystup: Perioda T0 [s], st(0) ; Algoritmus: 2 * pi * sqrt(l / [g]) PendulumPeriod0: ret ; Ukol 2: Napiste funkci ktera zkonvertuje uhel ve stupnich na radiany ; Vstup: Uhel alfa [°], st(0) ; Vystup: Uhel alfa [rad], st(0) ; Algoritmus: pi * alfa / 180 Deg2Rad: ret ; Ukol 3: Napiste funkci pro vypocet aritmeticko-geometrickeho prumeru ; Vstup: st(0), st(1) ; Vystup: Aritmeticko-geometricky prumer M(st(0), st(1)), st(0) ; Algoritmus: Iteracni vypocet, ; a(0) = st(0) a(n+1) = (a(n) + g(n)) / 2 ; g(0) = st(1) g(n+1) = sqrt(a(n) * g(n)) ; Ukoncovaci podminka: ; a(n) - g(n) < [precision] ArithmeticGeometricMean: ; FPU stack: { a(n) }{ g(n) } ; Vypocet g(n+1) ; FPU stack: { g(n+1) }{ a(n) }{ g(n) } ; Vypocet a(n+1) ; FPU stack: { a(n+1) }{ g(n+1) }{ a(n) }{ g(n) } ; Prepis starych hodnot novymi ; Ukoncovaci podminka -- rozdil a(n+1), g(n+1) ; Kdyz jse a(n+1) a g(n+1) temer nelisi, vraceni jedne z hodnot -- odstraneni st(1) ; Navrat ret