Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;program w assemblerze obliczajacy a^n rekurencyjnie
- default rel
- global main
- extern scanf
- extern printf
- section .data
- format db "%d", 10,0
- podstawa dd 0
- wykladnik dd 0
- section .text
- main:
- push rbp
- mov rbp, rsp
- mov rdi, format
- mov rsi, podstawa
- xor rax, rax
- call scanf wrt ..plt
- mov rdi, format
- mov rsi, wykladnik
- xor rax, rax
- call scanf wrt ..plt
- mov r13d, 2 ;licznik potrzebny do rekurencji (trzeba wiedziec kiedy skonczyc)
- cmp dword [wykladnik], 0
- je _jezeli_wykladnik_wynosi_0
- cmp dword [wykladnik], 1
- je _jezeli_wykladnik_wynosi_1
- jmp _jezeli_nie_0_ani_1
- _jezeli_wykladnik_wynosi_0:
- mov rdi, format
- mov rsi, 1
- xor rax, rax
- call printf wrt ..plt
- mov rsp, rbp
- pop rbp
- ret
- _jezeli_wykladnik_wynosi_1:
- mov rdi, format
- mov esi, [podstawa]
- xor rax, rax
- call printf wrt ..plt
- mov rsp, rbp
- pop rbp
- ret
- _jezeli_nie_0_ani_1:
- mov edi, [podstawa]
- mov esi, [wykladnik]
- mov edx, [podstawa] ;ponowne przekazanie po to aby miec początkową wartość podstawy potęgi
- call rekurencja
- mov rdi, format
- mov esi, eax
- xor rax, rax
- call printf wrt ..plt
- mov rsp, rbp
- pop rbp
- ret
- rekurencja:
- mov r14d, edx ;zapisanie poczatkowej wersji podstawy potęgi do mnożenia
- mov eax, edi
- mov r12d, r14d
- xor edx, edx
- mul r12d
- cmp esi, r13d ;r13d zachowuje swoją wartość pomiędzy wywołaniami funkcji
- je _zwroc
- inc r13d
- mov edi, eax
- mov esi, [wykladnik] ;edi, esi, edx nie zachowuje swojej wartosci pomiedzy wywołaniami
- mov edx, [podstawa] ;edx tracimy przy mnożeniu wiec trzeba jakos zapisac
- call rekurencja
- _zwroc:
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement