User Tools

Site Tools


isu:cv11

[ISU] 11. FPU - základy, aritmetika

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]
    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  ; 39.36055
    ret

cv11_1.asm jedno z mnoha řešení

cv11_1.asm jedno z mnoha řešení

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)
    fld dword [b]    ; b
    fld dword [a]    ; a   b
    fadd st1         ; a+b b
    fld dword [c]    ; c  a+b  b
    faddp st2        ; b+c a+b
    fmulp st1        ; (a+b)*(b+c)
 
    call WriteDouble ; 39.36055
    fstp st0         ; úklid, ulož st0 do st0 a popni
    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_2.asm jedno z mnoha řešení

cv11_2.asm jedno z mnoha řešení

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é!
 
    fldpi           ; pi
    fld dword [x]   ; x   pi
    fadd st0        ; x+x  pi
    faddp st1       ; (2x+pi)
 
    push __float32__(100.0)
    fld dword[esp]          ; 100  ()
    push __float32__(3.0)
    fld dword[esp]          ; 3.0  100.0  ()
    add esp, 8              ; úklid v zásobníku
 
    fld dword [x]           ; x  3.0  100.0  ()
    fmulp st1               ; 3x  100  ()
    fsubp                   ; 100-3x  ()
    fdivp st1               ; ()/()
    fsqrt                   ; sqrt()
 
    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)))

isu/cv11.txt · Last modified: 2024/04/20 15:36 by sakin