Advertisement
matogens

rekurencja nie ulepszona

May 28th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;program w assemblerze obliczajacy a^n rekurencyjnie
  2.  
  3. default rel
  4. global main
  5. extern scanf
  6. extern printf
  7.  
  8. section .data
  9.  
  10. format db "%d", 10,0
  11.  
  12. podstawa dd 0
  13. wykladnik dd 0
  14.  
  15. section .text
  16.  
  17. main:
  18.  
  19.     push rbp
  20.     mov rbp, rsp
  21.  
  22.     mov rdi, format
  23.     mov rsi, podstawa
  24.     xor rax, rax
  25.     call scanf wrt ..plt
  26.  
  27.     mov rdi, format
  28.     mov rsi, wykladnik
  29.     xor rax, rax
  30.     call scanf wrt ..plt
  31.  
  32.     mov r13d, 2 ;licznik potrzebny do rekurencji (trzeba wiedziec kiedy skonczyc)
  33.  
  34.     cmp dword [wykladnik], 0
  35.     je _jezeli_wykladnik_wynosi_0
  36.  
  37.     cmp dword [wykladnik], 1
  38.     je _jezeli_wykladnik_wynosi_1
  39.  
  40.     jmp _jezeli_nie_0_ani_1
  41.  
  42. _jezeli_wykladnik_wynosi_0:
  43.  
  44.     mov rdi, format
  45.     mov rsi, 1
  46.     xor rax, rax
  47.     call printf wrt ..plt
  48.    
  49.     mov rsp, rbp
  50.     pop rbp
  51.     ret
  52.  
  53. _jezeli_wykladnik_wynosi_1:
  54.  
  55.     mov rdi, format
  56.     mov esi, [podstawa]
  57.     xor rax, rax
  58.     call printf wrt ..plt
  59.  
  60.     mov rsp, rbp
  61.     pop rbp
  62.     ret
  63.  
  64. _jezeli_nie_0_ani_1:
  65.  
  66.     mov edi, [podstawa]
  67.     mov esi, [wykladnik]
  68.     mov edx, [podstawa] ;ponowne przekazanie po to aby miec początkową wartość podstawy potęgi
  69.     call rekurencja
  70.  
  71.     mov rdi, format
  72.     mov esi, eax
  73.     xor rax, rax
  74.     call printf wrt ..plt
  75.  
  76.     mov rsp, rbp
  77.     pop rbp
  78.     ret
  79.  
  80. rekurencja:
  81.  
  82.     mov r14d, edx ;zapisanie poczatkowej wersji podstawy potęgi do mnożenia
  83.  
  84.     mov eax, edi
  85.     mov r12d, r14d
  86.     xor edx, edx
  87.     mul r12d   
  88.  
  89.     cmp esi, r13d ;r13d zachowuje swoją wartość pomiędzy wywołaniami funkcji
  90.     je _zwroc
  91.     inc r13d
  92.  
  93.     mov edi, eax
  94.     mov esi, [wykladnik] ;edi, esi, edx nie zachowuje swojej wartosci pomiedzy wywołaniami
  95.     mov edx, [podstawa]  ;edx tracimy przy mnożeniu wiec trzeba jakos zapisac
  96.     call rekurencja
  97.  
  98. _zwroc:
  99.    
  100.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement