Advertisement
Guest User

Untitled

a guest
Jun 15th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. LAB 1
  2. Temat: Pętle, podstawowe operacje logiczne i arytmetyczne
  3.  
  4. Wykonane zadania:
  5. Program 1: Oszacowanie pierwiastka z liczby z dokładnością do części całkowitej według zależności:
  6. 1+3+5+...+(2n–1) = n^2
  7.  
  8.  
  9. Program 2:
  10. -wczytanie liczby w formacie tekstowym w reprezentacji dziesiętnej (stdin)
  11. - sprawdzenie poprawności wpisanego przez użytkownika ciągu znaków
  12. - zamiana na liczbę w rejestrze
  13. - zamiana na tekstową reprezentację dziewiątkową (ASCII)
  14.  
  15. Omówienie działania programów:
  16. Program 1:
  17.  
  18. Na początku deklarujemy stałą "ZMIENNA", gdzie będzie nasza wartość, z której chcemy oszacować pierwiastek. Na przykład 64.
  19.  
  20. .data
  21. SYSEXIT = 60
  22. ZMIENNA = 64
  23.  
  24. Następnie w rejestrze rax będą znajdowały się kolejno liczby nieparzyste, w rejestrze rcx nasz licznik, w którym końcowo znajdzie się nasz wynik, a do rejestru rbx zapisujemy liczbę, z której chcemy oszacować pierwiastek.
  25.  
  26. movq $-1, %rax
  27. movq $-1, %rcx
  28. movq $ZMIENNA, %rbx
  29.  
  30. Dodajemy 2 do rejestru rax (w ten sposób otrzymując kolejne nieparzyste), zwiększamy licznik, a następnie odejmujemy od rejestru rbx te kolejne nieparzyste liczby, dopóki rbx jest większe lub równe 0.
  31.  
  32. cykl:
  33. add $2, %rax
  34. inc %rcx
  35. sub %rax, %rbx
  36. jge cykl
  37.  
  38. W ten sposób w rejestrze rcx otrzymaliśmy "n", które jest oszacowaniem pierwiastka według zależności:
  39. 1+3+5+...+(2n–1) = n^2
  40.  
  41. Program 2:
  42.  
  43. Pobieramy od użytkownika dane do buforu textin.
  44. W naszym przypadku jest to liczba w formacie tekstowym w reprezentacji dziesiętnej.
  45.  
  46. movq $SYSREAD, %rax
  47. movq $STDIN, %rdi
  48. movq $textin, %rsi
  49. movq $BUFLEN, %rdx
  50. syscall
  51.  
  52.  
  53. Do rejestru r9 zapisujemy podstawę naszego systemu, do rejestru r12 podstawę systemu docelowego. W r8 będzie znajdowała się waga. W rax będzie znajdowała się nasza podstawa do potęgi waga, więc na razie zapisujemy 1 do rax.
  54.  
  55. movq $9, %r12
  56. movq $0, %r10
  57. movq $10, %r9
  58. movq %rax, %r8
  59. sub $2, %r8
  60. movq $0, %rdi
  61. movq $1, %rax
  62. movq $0, %r11
  63.  
  64. Obliczamy podstawa do potęgi waga do rejestru rax, czyli mnożymy razy naszą podstawę tyle razy, ile wynosi nasza aktualna waga.
  65.  
  66. potega:
  67. mul %r9
  68. inc %r10
  69. cmp %r10, %r8
  70. jg potega
  71.  
  72. Następnie sprawdzamy czy cyfra mieści się w przedziale od 0 do 9, czyli porównujemy kodu ascii. Jeżeli się nie mieści, należy ponownie wprowadzić dane, czyli wracamy do startu.
  73.  
  74. sprawdz:
  75. movb textin(, %rdi, 1), %bl
  76. cmp $'0',
  77. jl _start
  78. cmp $'9', %bl
  79. jg _start
  80.  
  81.  
  82. Obliczamy wartość cyfry, czyli odejmujemy kod ascii '0'. Następnie obliczoną wartość mnożymy razy to, co znajduje się w rejestrze rax, czyli podstawę do potęgi waga. Dodajemy to do rejestru r11. Wykonujemy te operacje (od pętli potega) az nasza waga bedzie rowna 0. W ten sposób w rejestrze r11 otrzymamy końcową wprowadzaną liczbę. Przenosimy tę liczbę to rejestru rax.
  83.  
  84. sub $'0', %bl
  85. inc %rdi
  86. mul %rbx
  87. add %rax, %r11
  88. movq $1, %rax
  89. dec %r8
  90. movq $0, %r10
  91.  
  92. cmp %r10, %r8
  93. jg potega
  94. cmp %r10, %r8
  95. je sprawdz
  96.  
  97. movq %r11, %rax
  98.  
  99. Na końcu zamieniamy na tekstową reprezentację dziewiątkową. W tym celu dzielimy przez docelową podstawę, czyli 9 a następnie dodajemy kod ascii '0'. W ten sposób otrzymujemy kod ascii najmłodszej pozycji i przenosimy na stos. Wykonujemy tę pętlę dopóki rax jest większe od 0.
  100.  
  101. movq $0, %r8
  102.  
  103. zamien:
  104. div %r12
  105. add $'0', %rdx
  106. push %rdx
  107. movq $0, %rdx
  108. inc %r8
  109. cmp $0, %rax
  110. jg zamien
  111.  
  112.  
  113. Zapisujemy kody ascii cyfr ze stosu do bufora wyjściowego.aśnie w tym celu odkładaliśmy na stos, żebyśmy potem mieli nasze kody ascii od najstarszej pozycji liczby.
  114.  
  115.  
  116. movq $0, %rdi
  117.  
  118. tekst:
  119. pop textout(, %rdi, 1)
  120. inc %rdi
  121. cmp %rdi, %r8
  122. jg tekst
  123.  
  124. Dopisujemy na końcu bufora znak nowej linii, a następnie wyświetlamy wynik.
  125.  
  126.  
  127. movb $'\n', textout(, %rdi, 1)
  128.  
  129. movq $SYSWRITE, %rax
  130. movq $STDOUT, %rdi
  131. movq $textout, %rsi
  132. movq $BUFLEN, %rdx
  133. syscall
  134.  
  135. Wnioski:
  136. Wszystkie programy działają prawidłowo. Zamiana na liczbę w rejestrze została wykonana w sposób inny niż ten pokazany na zajęciach laboratoryjnych. Jednak na przykładach, które użyłam w trakcie testowania poprawności działania, jest on równie skuteczny. Na tych zajęciach nauczyłam się jak wykonywać podstawowe operacje oraz obsługiwać pętle.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement