Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. %include "rw32-2018.inc"
  2.  
  3. CEXTERN memcpy
  4.  
  5. section .data
  6. task32A dd 3072.0,2304.0,1536.0,256.0,-768.0,512.0,-15360.0,-15104.0
  7. task32B dd -1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0,-1.0
  8.  
  9. section .text
  10. CMAIN:
  11. mov ebp, esp; for correct debugging
  12. push ebp
  13. mov ebp,esp
  14.  
  15. mov eax,__float32__(5.0)
  16. call task31
  17.  
  18. push 8
  19. push task32B
  20. push task32A
  21. call task32
  22. add esp,12
  23.  
  24. pop ebp
  25. ret
  26. ;
  27. ;--- Úkol 1 ---
  28. ;
  29. ;Naprogramujte funkci "task31", která pomocí koprocesoru FPU vypoèítá funkci f(x):
  30. ;
  31. ; sin(-2x + PI)
  32. ; f(x) = --------------
  33. ; x - 7
  34. ;
  35. ;Funkci je pøedáván parametr x v resgistru EAX a výsledek vrací také v registru EAX jako
  36. ;32bitové èíslo v plovoucí øádové èárce.
  37. ;
  38. ; - vstup:
  39. ; - EAX: hodnota x (32bitové èíslo v plovoucí øádové èárce)
  40. ; - výstup:
  41. ; - EAX = pùvodní hodnota x v pøípadì, že funkci nelze vypoèítat (tj. když je jmenovatel roven 0)
  42. ; - EAX = výsledek funkce f(x) (32bitové èíslo v plovoucí øádové èárce)
  43. ; - funkce musí zachovat obsah všech registrù, kromì registru EAX, registrù FPU a pøíznakového registru
  44. ; - nezapomeòte, že jmenovatel nesmí být 0 (tedy x - 7 <> 0)
  45. ; - nepoužívejte datový segment, svá data ukládejte v pøípadì potøeby, na zásobník jako lokální promìnné
  46. task31:
  47. ; zde zadejte kód funkce task31
  48. push ebp
  49. mov ebp, esp
  50.  
  51. finit ; nulovanie
  52.  
  53.  
  54. push eax ; [ ebp - 4 ]
  55. push __float32__(-2.0); [ ebp - 8 ]
  56. push __float32__(-7.0); [ ebp - 12 ]
  57.  
  58.  
  59.  
  60. fld dword [ebp - 4] ; [st0] -5
  61. fld dword [ ebp - 8 ]; [st0] -2 , st1 -5
  62.  
  63. fmulp ; st0 * st1 = st0 -10
  64.  
  65.  
  66. fldpi ; st0 3,14 st1 -10
  67.  
  68. faddp ; st0 + st1 ; st1 = 0
  69. fsin
  70.  
  71.  
  72.  
  73. fld dword [ ebp - 4 ]
  74. fld dword [ ebp - 12 ]
  75. faddp
  76.  
  77.  
  78.  
  79. fldz
  80. fcomip
  81. jz .end
  82.  
  83. fdivp
  84. fst dword [ ebp - 4 ]
  85. mov eax , [ ebp - 4 ]
  86.  
  87.  
  88.  
  89. .end:
  90. add esp , 12
  91.  
  92. pop ebp
  93. ret
  94. ;
  95. ;--- Úkol 2 ---
  96. ;
  97. ;Naprogramujte funkci "task32", jejímiž vstupními parametry jsou ukazatele na pole 32bitových hodnot v plovoucí øádové
  98. ;èá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é
  99. ;zkopíruje prvky z pole A do pole B funkcí "memcpy" (pozor, "memcpy" mìní obsah registrù ECX a EDX) a poté jednotlivé
  100. ;prvky pole A transformuje funkcí "task31" z úkolu 1. Funkci se pøedávají parametry na zásobníku podle konvence jazyka C
  101. ;a musí zachovat obsah registrù (kromì FPU, EAX a pøíznakù).
  102. ;
  103. ;int task32(float *pA, float *pB, unsigned int N)
  104. ; - vstup:
  105. ; pA: ukazatel na pole A (pole A obsahuje 32bitové hodnoty v plovoucí øádové èárce)
  106. ; pB: ukazatel na pole B (pole B obsahuje 32bitové hodnoty v plovoucí øádové èárce)
  107. ; N: poèet prvkù polí A a B (32bitové èíslo bez znaménka, mùže být i 0!)
  108. ; - výstup:
  109. ; - EAX = 0 pokud je ukazatel pA nebo pB neplatný (tedy pA == 0 || pB == 0) nebo pokud je pole prázdné (N == 0)
  110. ; - EAX = 1 pokud vše probìhne bez chyby
  111. ; - funkce musí zachovat obsah všech registrù, kromì registru EAX, registrù FPU a pøíznakového registru
  112. ; - nepoužívejte datový segment, svá data ukládejte v pøípadì potøeby, na zásobník jako lokální promìnné
  113. ;
  114. ;Funkce "memcpy":
  115. ; void* memcpy(void * destination, const void * source, size_t num)
  116. ; - vstup:
  117. ; size: poèet bytù, které mají být rezervovány v pamìti,
  118. ; destination: ukazatel na cílové místo v panìti,
  119. ; source: ukazatel zdroje kopírovaných dat
  120. ; - výstup:
  121. ; funkce vrací ukazatel "destination"
  122. ; -- POZOR -- memcpy mìní obsah registrù EAX, ECX a EDX
  123. ;
  124. ;Ukázka funkce "task32" v jazyce C:
  125. ;
  126. ;int task32(float *pA, float *pB, unsigned int N) {
  127. ; if (pB != NULL && pA != NULL && N > 0) {
  128. ; memcpy(pB, pA, N*sizeof(float));
  129. ; for(unsigned int i = 0; i < N; i++) pA[i] = task1(pA[i]);
  130. ; return 1;
  131. ; }
  132. ; return 0;
  133. ;}
  134. ;
  135. task32:
  136. ; zde zadejte kód funkce task32
  137. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement