;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