Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %include "rw32-2018.inc"
- CEXTERN memcpy
- section .data
- task32A dd 3072.0,2304.0,1536.0,256.0,-768.0,512.0,-15360.0,-15104.0
- task32B dd -1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0
- section .text
- CMAIN:
- mov ebp, esp; for correct debugging
- push ebp
- mov ebp,esp
- mov eax,__float32__(5.0)
- call task31
- push 8
- push task32B
- push task32A
- call task32
- add esp,12
- pop ebp
- ret
- ;
- ;--- Úkol 1 ---
- ;
- ;Naprogramujte funkci "task31", která pomocí koprocesoru FPU vypoèítá funkci f(x):
- ;
- ; sin(-2x + PI)
- ; f(x) = --------------
- ; x - 7
- ;
- ;Funkci je pøedáván parametr x v resgistru EAX a výsledek vrací také v registru EAX jako
- ;32bitové èíslo v plovoucí øádové èárce.
- ;
- ; - vstup:
- ; - EAX: hodnota x (32bitové èíslo v plovoucí øádové èárce)
- ; - výstup:
- ; - EAX = pùvodní hodnota x v pøípadì, že funkci nelze vypoèítat (tj. když je jmenovatel roven 0)
- ; - EAX = výsledek funkce f(x) (32bitové èíslo v plovoucí øádové èárce)
- ; - funkce musí zachovat obsah všech registrù, kromì registru EAX, registrù FPU a pøíznakového registru
- ; - nezapomeòte, že jmenovatel nesmí být 0 (tedy x - 7 <> 0)
- ; - nepoužívejte datový segment, svá data ukládejte v pøípadì potøeby, na zásobník jako lokální promìnné
- task31:
- ; zde zadejte kód funkce task31
- push ebp
- mov ebp, esp
- finit ; nulovanie
- push eax ; [ ebp - 4 ]
- push __float32__(-2.0); [ ebp - 8 ]
- push __float32__(-7.0); [ ebp - 12 ]
- fld dword [ebp - 4] ; [st0] -5
- fld dword [ ebp - 8 ]; [st0] -2 , st1 -5
- fmulp ; st0 * st1 = st0 -10
- fldpi ; st0 3,14 st1 -10
- faddp ; st0 + st1 ; st1 = 0
- fsin
- fld dword [ ebp - 4 ]
- fld dword [ ebp - 12 ]
- faddp
- fldz
- fcomip
- jz .end
- fdivp
- fst dword [ ebp - 4 ]
- mov eax , [ ebp - 4 ]
- .end:
- add esp , 12
- pop ebp
- ret
- ;
- ;--- Úkol 2 ---
- ;
- ;Naprogramujte funkci "task32", jejímiž vstupními parametry jsou ukazatele na pole 32bitových hodnot v plovoucí øádové
- ;èárce pA a pB a poèet prvkù tìchto polí N (mùže být i 0), a výstupem je hodnota 0 nebo 1 dle popisu níže. Funkce také
- ;zkopíruje prvky z pole A do pole B funkcí "memcpy" (pozor, "memcpy" mìní obsah registrù ECX a EDX) a poté jednotlivé
- ;prvky pole A transformuje funkcí "task31" z úkolu 1. Funkci se pøedávají parametry na zásobníku podle konvence jazyka C
- ;a musí zachovat obsah registrù (kromì FPU, EAX a pøíznakù).
- ;
- ;int task32(float *pA, float *pB, unsigned int N)
- ; - vstup:
- ; pA: ukazatel na pole A (pole A obsahuje 32bitové hodnoty v plovoucí øádové èárce)
- ; pB: ukazatel na pole B (pole B obsahuje 32bitové hodnoty v plovoucí øádové èárce)
- ; N: poèet prvkù polí A a B (32bitové èíslo bez znaménka, mùže být i 0!)
- ; - výstup:
- ; - EAX = 0 pokud je ukazatel pA nebo pB neplatný (tedy pA == 0 || pB == 0) nebo pokud je pole prázdné (N == 0)
- ; - EAX = 1 pokud vše probìhne bez chyby
- ; - funkce musí zachovat obsah všech registrù, kromì registru EAX, registrù FPU a pøíznakového registru
- ; - nepoužívejte datový segment, svá data ukládejte v pøípadì potøeby, na zásobník jako lokální promìnné
- ;
- ;Funkce "memcpy":
- ; void* memcpy(void * destination, const void * source, size_t num)
- ; - vstup:
- ; size: poèet bytù, které mají být rezervovány v pamìti,
- ; destination: ukazatel na cílové místo v panìti,
- ; source: ukazatel zdroje kopírovaných dat
- ; - výstup:
- ; funkce vrací ukazatel "destination"
- ; -- POZOR -- memcpy mìní obsah registrù EAX, ECX a EDX
- ;
- ;Ukázka funkce "task32" v jazyce C:
- ;
- ;int task32(float *pA, float *pB, unsigned int N) {
- ; if (pB != NULL && pA != NULL && N > 0) {
- ; memcpy(pB, pA, N*sizeof(float));
- ; for(unsigned int i = 0; i < N; i++) pA[i] = task1(pA[i]);
- ; return 1;
- ; }
- ; return 0;
- ;}
- ;
- task32:
- ; zde zadejte kód funkce task32
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement