Advertisement
Guest User

Untitled

a guest
Apr 16th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Obliczenie wyniku funkcji rekurencyjnej:
  2. # func(n){
  3. #   if (n==0) return 3;
  4. #   if (n==1) return 1;
  5. # return func(n-2)-5*func(n-1);}
  6. # n zadawane z klawiatury, wynik na standardowe wyjście,
  7. # funkcja przekazująca argumenty przez rejestry
  8. .data
  9.     STDIN = 0
  10.     STDOUT = 1
  11.     SYSWRITE = 1
  12.     SYSREAD = 0
  13.     SYSEXIT = 60
  14.     EXIT_SUCCESS = 0
  15.     BUFLEN = 512
  16.  
  17.     txt: .ascii "Podano znak inny niz cyfra!\n"
  18.     txt_len=.-txt
  19.  
  20. .bss
  21.     .comm textin, BUFLEN
  22.     .comm textout, BUFLEN
  23.  
  24. .text
  25.     .globl _start
  26.     _start:
  27.  
  28.     movq $SYSREAD, %rax
  29.     movq $STDIN, %rdi
  30.     movq $textin, %rsi
  31.     movq $BUFLEN, %rdx
  32.     syscall
  33.  
  34.     movq %rax, %r8
  35.     dec %r8         # -'\n'
  36.     movq $0, %rbx   # wyzerowanie rejestru b
  37.     movq $0, %rdi   # iterator
  38.     movq $10, %r10  # podstawa
  39.     movq $0, %rax   # liczba dziesietnie
  40.  
  41.     num1_decode:
  42.         movb textin(, %rdi, 1), %bl
  43.         cmp $'0', %bl
  44.         jl not_number
  45.         cmp $'9', %bl
  46.         jg not_number
  47.  
  48.         sub $'0', %bl
  49.  
  50.         mul %r10
  51.         add %rbx, %rax
  52.  
  53.         inc %rdi
  54.         cmp %r8, %rdi
  55.         jl num1_decode
  56.  
  57.     movq %rax, %r8
  58.     call func
  59.     mov %r9, %rax
  60.  
  61.     mov $0, %rdi
  62.     mov $0, %r8
  63.     cmp $0, %rax
  64.     jge positive
  65.         movb $'-', textout(, %rdi, 1)
  66.         inc %rdi
  67.         mov $-1, %r9
  68.         mul %r9
  69.         inc %r8
  70.     positive:
  71.     movq $10, %r10  # podstawa
  72.     movq $0, %rdx
  73.     to_stack:
  74.         div %r10
  75.         add $'0', %rdx
  76.         push %rdx
  77.         movq $0, %rdx
  78.         inc %r8
  79.         cmp $0, %rax
  80.         jg to_stack
  81.  
  82.     to_text:
  83.         pop textout(, %rdi, 1)
  84.         inc %rdi
  85.         cmp %r8, %rdi
  86.         jl to_text
  87.  
  88.     print:
  89.     movb $'\n', textout(, %rdi, 1)
  90.  
  91.     movq $SYSWRITE, %rax
  92.     movq $STDOUT, %rdi
  93.     movq $textout, %rsi
  94.     movq $BUFLEN, %rdx
  95.     syscall
  96.     jmp exit
  97.  
  98.     not_number:
  99.     movq $SYSWRITE, %rax
  100.     movq $STDOUT, %rdi
  101.     movq $txt, %rsi
  102.     movq $txt_len, %rdx
  103.     syscall
  104.  
  105.     exit:
  106.     movq $SYSEXIT, %rax
  107.     movq $EXIT_SUCCESS, %rdi
  108.     syscall
  109.  
  110.  
  111. func:
  112.     push %rbp
  113.     mov %rsp, %rbp
  114.     sub $16, %rsp
  115.     mov %r8, -8(%rbp)
  116.     mov %r10, -16(%rbp)
  117.         cmp $0, %r8
  118.         je is0
  119.         cmp $1, %r8
  120.         je is1
  121.  
  122.         dec %r8
  123.         call func
  124.         mov $5, %rax  
  125.         mul %r9
  126.         mov %rax, %r10
  127.         # %r10 = 5f(n-1)
  128.        
  129.         dec %r8
  130.         call func
  131.         # %r9 = f(n-2)
  132.        
  133.         sub %r10, %r9
  134.         jmp end
  135.     is0:
  136.         movq $3, %r9
  137.         jmp end
  138.     is1:
  139.         movq $1, %r9
  140.     end:
  141.     mov -8(%rbp), %r8
  142.     mov -16(%rbp), %r10
  143.     mov %rbp, %rsp
  144.     pop %rbp
  145. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement