Facebook
From Emerald Zebra, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 230
  1. SYSCALL = 0x80
  2. EXIT = 1
  3. WRITE = 4
  4. READ = 3
  5. STDOUT = 1
  6. STDIN = 0
  7. ZERO = 0
  8. BUFOR_SIZE = 10
  9. BAZA_SYSTEMU = 10
  10.  
  11. .data
  12. buf_size = 31
  13. text_size: .long 0
  14. bufor: .space buf_size
  15.  
  16. .text
  17. .global _start
  18. _start:
  19.         movl $1, %eax
  20.  
  21.         push %eax #przeslanie parametru
  22.         call silnia
  23.         _t9: #wynik w %rax
  24.  
  25.         #poprawne wyjscie z programu
  26.         movl $EXIT, %eax
  27.         int $SYSCALL
  28.  
  29. silnia:
  30.         push %ebp #zapis stosu programu głównego
  31.         movl %esp, %ebp # ustawienie nowego stosu w miejscu aktualnej pozycji stosu
  32.         movl 16(%ebp), %ebx # pobranie 1 parametru, czyli 5
  33.         _t1:
  34.  
  35.         cmp $1, %ebx # jeśli 1 to koniec, dalej nie ma potrzeby wchodzi w rekurencje
  36.         je silnia_ret #do ret
  37.  
  38.         dec %ebx
  39.         push %ebx #kolejny argument na stos, zmniejszony o 1
  40.  
  41.         call silnia # rekurencja
  42.  
  43.         # pomnożenie aktualnego parametru razy wynik poprzedniego wywołania
  44.         movl 16(%ebp), %ebx
  45.         _t2:
  46.         imul %ebx, %eax
  47.         _t3:
  48.         # czyli: n * factorial( n - 1 )
  49.  
  50.         # koniec
  51.         jmp koniec
  52. silnia_ret:
  53.         movl $1, %eax
  54. koniec:
  55.         _t5:
  56.         # przywrocenie stosu POPRZEDNIEGO wywołania funkcji
  57.         movl %ebp, %esp
  58.         pop %ebp
  59.         ret #powrót do adresu instrukcji zapisanej na stosie
  60.  
  61. movl $EXIT, %eax
  62. int $SYSCALL
  63.