Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LAB 1
- Temat: Pętle, podstawowe operacje logiczne i arytmetyczne
- Wykonane zadania:
- Program 1: Oszacowanie pierwiastka z liczby z dokładnością do części całkowitej według zależności:
- 1+3+5+...+(2n–1) = n^2
- Program 2:
- -wczytanie liczby w formacie tekstowym w reprezentacji dziesiętnej (stdin)
- - sprawdzenie poprawności wpisanego przez użytkownika ciągu znaków
- - zamiana na liczbę w rejestrze
- - zamiana na tekstową reprezentację dziewiątkową (ASCII)
- Omówienie działania programów:
- Program 1:
- Na początku deklarujemy stałą "ZMIENNA", gdzie będzie nasza wartość, z której chcemy oszacować pierwiastek. Na przykład 64.
- .data
- SYSEXIT = 60
- ZMIENNA = 64
- Następnie w rejestrze rax będą znajdowały się kolejno liczby nieparzyste, w rejestrze rcx nasz licznik, w którym końcowo znajdzie się nasz wynik, a do rejestru rbx zapisujemy liczbę, z której chcemy oszacować pierwiastek.
- movq $-1, %rax
- movq $-1, %rcx
- movq $ZMIENNA, %rbx
- Dodajemy 2 do rejestru rax (w ten sposób otrzymując kolejne nieparzyste), zwiększamy licznik, a następnie odejmujemy od rejestru rbx te kolejne nieparzyste liczby, dopóki rbx jest większe lub równe 0.
- cykl:
- add $2, %rax
- inc %rcx
- sub %rax, %rbx
- jge cykl
- W ten sposób w rejestrze rcx otrzymaliśmy "n", które jest oszacowaniem pierwiastka według zależności:
- 1+3+5+...+(2n–1) = n^2
- Program 2:
- Pobieramy od użytkownika dane do buforu textin.
- W naszym przypadku jest to liczba w formacie tekstowym w reprezentacji dziesiętnej.
- movq $SYSREAD, %rax
- movq $STDIN, %rdi
- movq $textin, %rsi
- movq $BUFLEN, %rdx
- syscall
- Do rejestru r9 zapisujemy podstawę naszego systemu, do rejestru r12 podstawę systemu docelowego. W r8 będzie znajdowała się waga. W rax będzie znajdowała się nasza podstawa do potęgi waga, więc na razie zapisujemy 1 do rax.
- movq $9, %r12
- movq $0, %r10
- movq $10, %r9
- movq %rax, %r8
- sub $2, %r8
- movq $0, %rdi
- movq $1, %rax
- movq $0, %r11
- Obliczamy podstawa do potęgi waga do rejestru rax, czyli mnożymy razy naszą podstawę tyle razy, ile wynosi nasza aktualna waga.
- potega:
- mul %r9
- inc %r10
- cmp %r10, %r8
- jg potega
- Następnie sprawdzamy czy cyfra mieści się w przedziale od 0 do 9, czyli porównujemy kodu ascii. Jeżeli się nie mieści, należy ponownie wprowadzić dane, czyli wracamy do startu.
- sprawdz:
- movb textin(, %rdi, 1), %bl
- cmp $'0',
- jl _start
- cmp $'9', %bl
- jg _start
- Obliczamy wartość cyfry, czyli odejmujemy kod ascii '0'. Następnie obliczoną wartość mnożymy razy to, co znajduje się w rejestrze rax, czyli podstawę do potęgi waga. Dodajemy to do rejestru r11. Wykonujemy te operacje (od pętli potega) az nasza waga bedzie rowna 0. W ten sposób w rejestrze r11 otrzymamy końcową wprowadzaną liczbę. Przenosimy tę liczbę to rejestru rax.
- sub $'0', %bl
- inc %rdi
- mul %rbx
- add %rax, %r11
- movq $1, %rax
- dec %r8
- movq $0, %r10
- cmp %r10, %r8
- jg potega
- cmp %r10, %r8
- je sprawdz
- movq %r11, %rax
- Na końcu zamieniamy na tekstową reprezentację dziewiątkową. W tym celu dzielimy przez docelową podstawę, czyli 9 a następnie dodajemy kod ascii '0'. W ten sposób otrzymujemy kod ascii najmłodszej pozycji i przenosimy na stos. Wykonujemy tę pętlę dopóki rax jest większe od 0.
- movq $0, %r8
- zamien:
- div %r12
- add $'0', %rdx
- push %rdx
- movq $0, %rdx
- inc %r8
- cmp $0, %rax
- jg zamien
- Zapisujemy kody ascii cyfr ze stosu do bufora wyjściowego. Właśnie w tym celu odkładaliśmy na stos, żebyśmy potem mieli nasze kody ascii od najstarszej pozycji liczby.
- movq $0, %rdi
- tekst:
- pop textout(, %rdi, 1)
- inc %rdi
- cmp %rdi, %r8
- jg tekst
- Dopisujemy na końcu bufora znak nowej linii, a następnie wyświetlamy wynik.
- movb $'\n', textout(, %rdi, 1)
- movq $SYSWRITE, %rax
- movq $STDOUT, %rdi
- movq $textout, %rsi
- movq $BUFLEN, %rdx
- syscall
- Wnioski:
- Wszystkie programy działają prawidłowo. Zamiana na liczbę w rejestrze została wykonana w sposób inny niż ten pokazany na zajęciach laboratoryjnych. Jednak na przykładach, które użyłam w trakcie testowania poprawności działania, jest on równie skuteczny. Na tych zajęciach nauczyłam się jak wykonywać podstawowe operacje oraz obsługiwać pętle.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement