Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- STDIN_READ = 0
- STDOUT_WRITE = 1
- EXIT_SUC = 0
- SYS_EXIT = 60
- BUFLEN = 512
- BASE_IN = 3
- BASE_OUT = 10
- .bss
- .comm NUM_IN, 512
- .comm NUM_3, 64
- .comm NUM_OUT, 64
- .data
- ERROR_MSG: .ascii "Poza zasiegiem systemu 3\n\0"
- ERROR_LEN= . - ERROR_MSG
- .text
- .global main
- main:
- # pobranie liczby od usera
- mov $STDIN_READ, %rax
- mov $STDIN_READ, %rdi
- mov $NUM_IN, %rsi
- mov $BUFLEN, %rdx
- syscall
- mov %rax, %rdi # iterator w pętli LOOP
- sub $2, %rdi # iterujemy od 0 i omijamy znak nowej linii
- mov $0, %r11 # Dazymy az do RDI
- mov $1, %rsi # wartość potęgi podstawy w danej iteracji
- mov $0, %r8 # wynik przeksztalcenia na dziesiętny
- LOOP:
- cmp %rdi, %r11
- jg END_LOOP
- mov $0, %rax
- movb NUM_IN(, %r11, 1), %al #Pobranie cyfry z pozycji R11 (zaczynam od lewej tym razem)
- subb $0x30, %al
- #Zakres liczby
- cmp $3, %rax
- jge ERROR
- cmp $0, %rax
- jl ERROR
- mul %rsi #Mnoze razy wartosc potegi 3^0 = 1 w pirwszej iteracji
- add %rax, %r8 #Wynik trzymam tu
- mov %rsi, %rax #1
- mov $BASE_IN, %rbx #3
- mul %rbx #Mnoze razy baze - kolejne potegi podstawy
- mov %rax, %rsi #Zmieniam na wyzsza pozycje
- inc %r11 #Nastepna pozycja
- jmp LOOP
- END_LOOP:
- mov $0, %rax
- mov %r8, %rax #Nasz wynik (wartosc)
- #Zamiana na system dziewiatkowy
- #BASE_OUT = 9
- mov $9, %rbx #Baza wyjsciowa
- mov $0, %rdi #Iterator dla reszt
- CONVERT_TO_9: #Dzielic przez 9 dopoki rax > 0
- cmp $0, %rax
- jle PRINT_RESULT
- mov $0, %rdx #Wyczyscic
- div %rbx #Dziele przez baze, reszta w RDX
- movb %dl, NUM_3(, %rdi, 1) #Zapisuje
- inc %rdi
- jmp CONVERT_TO_9
- PRINT_RESULT:
- mov $0, %rsi
- mov $1, %r10
- add %rdi, %r10 #r10 = r10 + rdi
- CONVERT_TO_STRING:
- dec %rdi
- movb NUM_3(, %rdi, 1), %al
- add $0x30, %rax
- movb %al, NUM_OUT(, %rsi, 1)
- inc %rsi
- cmp $1, %rdi
- jl PRINT
- jmp CONVERT_TO_STRING
- PRINT:
- mov $STDOUT_WRITE, %rax
- mov $STDOUT_WRITE, %rdi
- mov $NUM_OUT, %rsi
- mov %r10, %rdx
- syscall
- jmp END_PROGRAM
- ERROR:
- mov $STDOUT_WRITE, %rax
- mov $STDOUT_WRITE, %rdi
- mov $ERROR_MSG, %rsi
- mov $ERROR_LEN, %rdx
- syscall
- jmp END_PROGRAM
- END_PROGRAM:
- mov $SYS_EXIT, %rax
- mov %r8, %rdx
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement