SYSCALL = 0x80 EXIT = 1 WRITE = 4 READ = 3 STDOUT = 1 STDIN = 0 ZERO = 0 BUFOR_SIZE = 10 BAZA_SYSTEMU = 10 .data buf_size = 31 text_size: .long 0 bufor: .space buf_size .text .global _start _start: movl $1, %eax push %eax #przeslanie parametru call silnia _t9: #wynik w %rax #poprawne wyjscie z programu movl $EXIT, %eax int $SYSCALL silnia: push %ebp #zapis stosu programu głównego movl %esp, %ebp # ustawienie nowego stosu w miejscu aktualnej pozycji stosu movl 16(%ebp), %ebx # pobranie 1 parametru, czyli 5 _t1: cmp $1, %ebx # jeśli 1 to koniec, dalej nie ma potrzeby wchodzi w rekurencje je silnia_ret #do ret dec %ebx push %ebx #kolejny argument na stos, zmniejszony o 1 call silnia # rekurencja # pomnożenie aktualnego parametru razy wynik poprzedniego wywołania movl 16(%ebp), %ebx _t2: imul %ebx, %eax _t3: # czyli: n * factorial( n - 1 ) # koniec jmp koniec silnia_ret: movl $1, %eax koniec: _t5: # przywrocenie stosu POPRZEDNIEGO wywołania funkcji movl %ebp, %esp pop %ebp ret #powrót do adresu instrukcji zapisanej na stosie movl $EXIT, %eax int $SYSCALL