Advertisement
Guest User

3to9

a guest
Mar 18th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 2.50 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement