Advertisement
Hinski2

Untitled

May 24th, 2024
13
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. # zad2
  2.  
  3. ---
  4.  
  5. ``__attribute__((leaf))`` mówi kompilatorowi, że dana funkcja jest funkcją liściową, czyli nie wywołuje innych funkcji
  6. ``__attribute__((pure))`` mówi kompilatorowi, że funkcja jest czystą funkcją, czyli funkcją która nie ma efektów ubocznych oraz jej wynik zależy tylko od jej argumentów i globalnych zmiennych, kórych nie zmienia
  7. ``inlining`` to optymalizacja kompilatora polegająca na zastąpieniu wywołania funkcji jej ciałem w miejscu wywołania.
  8.  
  9.  
  10. #### kod w c:
  11. <style>
  12. .full-width-table table {
  13. width: 100%;
  14. max-width: fit-content;
  15. margin-left: auto;
  16. margin-right: auto;
  17. }
  18. </style>
  19.  
  20. <div class="full-width-table">
  21.  
  22. <table>
  23. <tr>
  24. <td>
  25.  
  26. ```c
  27. __attribute__((leaf))
  28. size_t my_strlen(const char *s);
  29.  
  30. const char *my_index(const char *s, char v) {
  31. for (size_t i = 0; i < my_strlen(s); i++)
  32. if (s[i] == v)
  33. return &s[i];
  34. return 0;
  35. }
  36. ```
  37.  
  38. </td>
  39. <td>
  40.  
  41. ```c
  42. __attribute__((pure))
  43. size_t my_strlen(const char *s);
  44.  
  45. const char *my_index(const char *s, char v) {
  46. for (size_t i = 0; i < my_strlen(s); i++)
  47. if (s[i] == v)
  48. return &s[i];
  49. return 0;
  50. }
  51. ```
  52.  
  53.  
  54.  
  55. </td>
  56. </tr>
  57. </table>
  58.  
  59. #### kod w asm:
  60.  
  61. <table>
  62. <tr>
  63. <td>
  64.  
  65. ``` nasm
  66. my_index:
  67. pushq %r12
  68. movl %esi, %r12d
  69. pushq %rbp
  70. xorl %ebp, %ebp
  71. pushq %rbx
  72. movq %rdi, %rbx
  73. .L2:
  74. movq %rbx, %rdi
  75. call my_strlen
  76. cmpq %rax, %rbp
  77. jnb .L8
  78. cmpb %r12b, (%rbx,%rbp)
  79. jne .L3
  80. leaq (%rbx,%rbp), %rax
  81. jmp .L1
  82. .L3:
  83. incq %rbp
  84. jmp .L2
  85. .L8:
  86. xorl %eax, %eax
  87. .L1:
  88. popq %rbx
  89. popq %rbp
  90. popq %r12
  91. ret
  92. ```
  93.  
  94. </td>
  95. <td>
  96.  
  97. ```nasm
  98. my_index:
  99. pushq %rbp
  100. movl %esi, %ebp
  101. pushq %rbx
  102. movq %rdi, %rbx
  103. pushq %rcx
  104. call my_strlen
  105. movq %rax, %rdx
  106. movq %rbx, %rax
  107. addq %rbx, %rdx
  108. .L2:
  109. cmpq %rdx, %rax
  110. je .L8
  111. leaq 1(%rax), %rcx
  112. cmpb %bpl, (%rax)
  113. je .L1
  114. movq %rcx, %rax
  115. jmp .L2
  116. .L8:
  117. xorl %eax, %eax
  118. .L1:
  119. popq %rdx
  120. popq %rbx
  121. popq %rbp
  122. ret
  123. ```
  124.  
  125.  
  126. </td>
  127. </tr>
  128. </table>
  129.  
  130. ```c
  131. static size_t my_strlen(const char *s){
  132. size_t len = 0;
  133. while(s[len] != '\0')
  134. len++;
  135.  
  136. return len;
  137. }
  138.  
  139. const char *my_index(const char *s, char v) {
  140. for (size_t i = 0; i < my_strlen(s); i++)
  141. if (s[i] == v)
  142. return &s[i];
  143. return 0;
  144. }
  145. ```
  146.  
  147. ```nasm
  148. my_index:
  149. pushq %rbp
  150. movl %esi, %ebp
  151. pushq %rbx
  152. movq %rdi, %rbx
  153. pushq %rcx
  154. call strlen
  155. xorl %edx, %edx
  156. .L2:
  157. cmpq %rax, %rdx
  158. jnb .L8
  159. cmpb %bpl, (%rbx,%rdx)
  160. jne .L3
  161. leaq (%rbx,%rdx), %rax
  162. jmp .L1
  163. .L3:
  164. incq %rdx
  165. jmp .L2
  166. .L8:
  167. xorl %eax, %eax
  168. .L1:
  169. popq %rdx
  170. popq %rbx
  171. popq %rbp
  172. ret
  173. ```
  174.  
  175. kompilator wstawił my_strlen do my_index. Dzięki temu że dodaliśmy static do my_strlen kompilator wie:
  176. * Funkcja nie jest modyfikowana w innych plikach.
  177. * Funkcja nie ma efektów ubocznych, które są niewidoczne w bieżącym pliku.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement