isu:cv11
Table of Contents
[ISU] 11. FPU - základy, aritmetika
- Moodle: Podklady ke cvičení 11 (IS VUT)
- Vysvětlení desetinných čísel (youtube): Floating Point Numbers - Computerphile
- Slides cvika: Marty Sakin, Jakub Husa
cv11_A.asm ukázka
- cv11_A.asm
; Ukázka jak načíst data do FPU registrů/zásobníku a jak zásobník funguje %include "rw32.inc" section .data a dd 1.0 b dd 2.222 c dd 3 d dd 4 e dd 5.5 f dd 66.66 section .text main: FINIT fld dword [a] ; load variable "a" fld dword [b] fld dword [c] ; !! fild dword [d] fild dword [e] ; !! fld dword [f] nop fst dword [b] ; check variable fstp dword [d] ; in debug set float fstp dword [e] fistp dword [c] nop fld1 ; Načte 1.0 do registru st0 fldz ; Načte 0.0 do registru st0 fldpi ; Načte číslo Pi ret
cv11_B.asm ukázka
- cv11_B.asm
; Ukázka: x = a + 4b + 2c %include "rw32.inc" section .data a dd 1.0 b dd 2.0 c dd 3.0 section .text main: FINIT fld dword [a] ; a fld dword [b] ; b a fld dword [c] ; c b a fxch st0, st1 ; b c a fadd st0, st0 ; b+b c a fxch st0, st1 ; c 2b a faddp ; c+2b a (nan) fadd st0 ; 2c+4b a (nan) faddp st1 ; 2c+4b+a (nan) (nan) call WriteDouble faddp st2,st0 ; (nan) (nan) (nan) ret
cv11_C.asm ukázka
- cv11_C.asm
; Ukázka vložení vlastního čísla %include "rw32.inc" section .text funkce: enter 0,0 ; ... ; HINT: vložení vlastního čísla do FPU registru st0 push __float32__(66.6) fld dword[esp] add esp, 4 ; ... leave ret main: FINIT call funkce call WriteDouble fstp st0 ; promazání fpu zásobníku ret
cv11_1.asm
- cv11_1.asm
%include "rw32.inc" section .data a dd 1.1 b dd 3.33 c dd 5.555 section .text main: FINIT ; Pomocí FPU vypočítejte: y = (a+b)*(b+c) ; Výsledek v st0 call WriteDouble ret
cv11_2.asm
- cv11_2.asm
%include "rw32.inc" section .data x dd 32.2 section .text main: FINIT enter 0,0 ; Pomocí FPU vypočítejte: ; st0 = sqrt( (2*x + pi) / (100 - 3*x) ) ; Ostatní registry FPU prázdné! call WriteDouble ; => 4.45704 leave ret
cv11_3.asm
- cv11_3.asm
; Napiš funkci totalArr (konvence CDECL), která prochází float čísla v poli, ; každé číslo vynásobí indexem na kterém se v poli nachází (indexování od 0) ; a výsledkem bude suma těchto čísel v registru st0 (ostatní prázdné). ; float totalArr(float *pArray, int N); %include "rw32.inc" section .data pArray dd 99.99, 12.34, 20.61, 3.92, 6.84, 15.65, 11.26, 9.11, 12.53 section .text ; float totalArr(float *pArray, int N); totalArr: ret main: FINIT enter 0,0 push dword 9 ; N - počet prvků pole push pArray ; ukazatel na pole call totalArr ; zavolání funkce add esp, 8 ; odstranění parametrů call WriteDouble ; ==> 402.50000 leave ret
cv11_4.asm
- cv11_4.asm
; Ultra vzoreček ; st0 = ((4*a - 3*b*(c-d))*(a-d))/(a+sqrt(b*c+sin(a)))
Doporučení: rozkreslete si vzorec jako binární strom.
isu/cv11.txt · Last modified: 2025/04/24 12:00 by sakin