SHARE
TWEET

3to9

a guest Mar 18th, 2019 91 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. STDIN_READ = 0
  2. STDOUT_WRITE = 1
  3.  
  4. EXIT_SUC = 0
  5. SYS_EXIT = 60
  6.  
  7. BUFLEN = 512
  8.  
  9. BASE_IN = 3
  10. BASE_OUT = 10
  11.  
  12. .bss
  13. .comm NUM_IN, 512
  14. .comm NUM_3, 64
  15. .comm NUM_OUT, 64
  16.  
  17. .data
  18. ERROR_MSG: .ascii "Poza zasiegiem systemu 3\n\0"
  19. ERROR_LEN= . - ERROR_MSG
  20.  
  21. .text
  22. .global main
  23. main:
  24.  
  25.         # pobranie liczby od usera
  26.         mov $STDIN_READ, %rax
  27.         mov $STDIN_READ, %rdi
  28.         mov $NUM_IN, %rsi
  29.         mov $BUFLEN, %rdx
  30.         syscall
  31.  
  32.         mov %rax, %rdi  # iterator w pętli LOOP
  33.         sub $2, %rdi    # iterujemy od 0 i omijamy znak nowej linii
  34.     mov $0, %r11    # Dazymy az do RDI
  35.         mov $1, %rsi    # wartość potęgi podstawy w danej iteracji
  36.         mov $0, %r8     # wynik przeksztalcenia na dziesiętny
  37.  
  38.         LOOP:
  39.                 cmp %rdi, %r11
  40.         jg END_LOOP
  41.         mov $0, %rax
  42.         movb NUM_IN(, %r11, 1), %al #Pobranie cyfry z pozycji R11 (zaczynam od lewej tym razem)
  43.         subb $0x30, %al
  44.  
  45.     #Zakres liczby
  46.     cmp $3, %rax
  47.     jge ERROR
  48.     cmp $0, %rax
  49.     jl ERROR
  50.  
  51.     mul %rsi    #Mnoze razy wartosc potegi 3^0 = 1 w pirwszej iteracji
  52.     add %rax, %r8   #Wynik trzymam tu
  53.    
  54.     mov %rsi, %rax  #1
  55.     mov $BASE_IN, %rbx  #3
  56.     mul %rbx    #Mnoze razy baze - kolejne potegi podstawy
  57.     mov %rax, %rsi  #Zmieniam na wyzsza pozycje
  58.    
  59.     inc %r11    #Nastepna pozycja
  60.     jmp LOOP
  61.  
  62.     END_LOOP:
  63.     mov $0, %rax
  64.     mov %r8, %rax   #Nasz wynik (wartosc)
  65.  
  66.     #Zamiana na system dziewiatkowy
  67.     #BASE_OUT = 9
  68.    
  69.     mov $9, %rbx    #Baza wyjsciowa
  70.     mov $0, %rdi    #Iterator dla reszt
  71.  
  72.     CONVERT_TO_9:   #Dzielic przez 9 dopoki rax > 0
  73.     cmp $0, %rax
  74.     jle PRINT_RESULT
  75.     mov $0, %rdx    #Wyczyscic
  76.     div %rbx    #Dziele przez baze, reszta w RDX
  77.  
  78.     movb %dl, NUM_3(, %rdi, 1) #Zapisuje
  79.     inc %rdi
  80.     jmp CONVERT_TO_9
  81.    
  82.     PRINT_RESULT:
  83.     mov $0, %rsi
  84.     mov $1, %r10
  85.     add %rdi, %r10  #r10 = r10 + rdi
  86.  
  87.     CONVERT_TO_STRING:
  88.     dec %rdi
  89.     movb NUM_3(, %rdi, 1), %al
  90.     add $0x30, %rax
  91.     movb %al, NUM_OUT(, %rsi, 1)
  92.     inc %rsi
  93.  
  94.     cmp $1, %rdi
  95.     jl PRINT
  96.     jmp CONVERT_TO_STRING
  97.  
  98.     PRINT:
  99.     mov $STDOUT_WRITE, %rax
  100.     mov $STDOUT_WRITE, %rdi
  101.     mov $NUM_OUT, %rsi
  102.     mov %r10, %rdx
  103.     syscall
  104.     jmp END_PROGRAM
  105.  
  106. ERROR:
  107.     mov $STDOUT_WRITE, %rax
  108.     mov $STDOUT_WRITE, %rdi
  109.     mov $ERROR_MSG, %rsi
  110.     mov $ERROR_LEN, %rdx
  111.     syscall
  112.     jmp END_PROGRAM
  113.  
  114. END_PROGRAM:
  115.     mov $SYS_EXIT, %rax
  116.     mov %r8, %rdx
  117.     syscall
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top