matematykaszkolna.pl
Programowanie Mips: Witam, programował ktoś może w Asemblerze MIPS? Miałbym parę pytań emotka
9 cze 20:15
Metis: Asembler? Czarną magią się nie zajmujemy.
9 cze 20:18
Mips: Aż taka czarna to ona nie jest emotka
9 cze 20:21
Metis: Nie? section .data msg db "Hello, world!",0xa len equ $ − msg section .text global start start: mov edx,len mov ecx,msg mov ebx,1 mov eax,4 int 0x80 mov ebx,0 mov eax,1 int 0x80
9 cze 20:24
Metis: Ale nie czepiam się, nie działam z jezykami niskiego poziomu, może ktoś lubi
9 cze 20:25
Pytający: W asemblerze tak, w MIPSie nie, ale szczegóły da się wyszukać, więc pytania możesz rzucić − a nuż nie będą czarną magią. emotka
9 cze 20:55
Mips: ok, więc mam za zadanie zapisać na stosie łańcuch znaków, by potem móc ten łańcuch wyświetlić oraz wyświetlić jego poszczególne elementy. Jako, że w ogóle nie miałem do czynienia ze stosami to jak zapisać takiego stringa?
9 cze 20:58
Pytający: Tu masz dość ogólny opis tego assemblera: http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm Tu masz przykład z wypisaniem znaku na i−tej pozycji: https://pastebin.com/aUcu3H2x A tu masz całkiem przyjemny symulator, na którym to uruchamiałem: http://courses.missouristate.edu/kenvollmar/mars/
10 cze 00:06
Mips: Dzięki wielkie za pomoc. Mam jeszcze pytanie jak zrealizować takie wyświetlanie je?żeli String mam zapisany w rejestrze np $t0 i użytkownik wpisuje który wyraz z tego stosu wyświetlić
10 cze 12:42
Pytający: W rejestrze możesz mieć oczywiście adres stringa, nie samego stringa, rejestry tu masz 32 bitowe. Z tego co widzę w podesłanym Ci linku z opisem nie ma systemcalla "printChar", jedynie "printString" do łańcuchów. Zatem najprościej byłoby chyba w sekcji .data zadeklarować: printCharString: .asciiz "a" # jakikolwiek string jednoznakowy (faktycznie dwuznakowy łańcuch, bo na końcu zostanie dodany znak 0 (koniec stringu) ze względu na .asciiz) Załóżmy, że w $t0 masz adres stringa, z którego chcesz odczytać znak o indeksie zapisanym w $t1. Można to zrobić tak: add $t2, $t0, $t1 # t2=t0+t1, czyli adres szukanego znaku lb $t3, ($t2) # wczytanie do $t3 bajtu spod adresu zapisanego w $t2 la $t4, printCharString # wczytanie do $t4 adresu łańcucha do wypisywania sb $t3, ($t4) # zapisanie bajtu z $t3 do pamięci o adresie z $t4 Teraz pozostaje wyświetlić ten string (znak): li $v0, 4 la $a0, printCharString # albo np. addi $a0, $t4, 0 syscall
10 cze 14:07
Mips: Dzieki jeszcze raz. Ostatnie pytanie: chcę zamienić wielkość liter w tym Stringu z mały na duze i dużych na małe i wyświetlić oraz odwrócić Stringa i również wyświetlić. Wiem, ze różnica pomiędzy duzymi a malymi literami w tablicy ASCII wynosi 10, ale kompletnie nie wiem jak pozmieniac kolejne litery w tym łańcuch.
10 cze 14:18
Pytający: Różnica w ASCII między małymi a wielkimi literami to 32. W pętli dojść do końca stringa (porównujesz kolejne znaki do 0, tak jest oznaczony koniec stringu). Następnie odczytujesz znaki od końca zapisując do nowego stringa w tej kolejności. Raczej potrzebujesz licznika, bo przed stringiem nie ma 0, więc musisz inaczej pętlę ograniczyć. Samą zamianę liter możesz zrobić w ten sposób: sprawdzasz, czy znak jest małą literą (97≤znak≤122), jeśli tak odejmujesz te 32 przed przepisaniem. Analogicznie dla wielkiech liter, pozostałych znaków (spacje etc.) nie ruszasz. Jutro zerknę do tego tematu.
10 cze 14:42
Mips: Sorry, że Cię tak męczę i zadaje głupie pytania emotka Jak byś napisał taką pętlę?
10 cze 23:47
Mips: Jeżeli mam String zapisany w .data to zrobiłem odwracanie, ale z tą pętlą i licznikiem nie mogę sobie jakoś poradzić.
11 cze 00:20
Mips: Dobra olśniło mnie emotka Stringa odwróciłem, ale nadal mam problemy z zamianą liter.
11 cze 00:36
Mips: up emotka
11 cze 12:47
Mips: up
11 cze 16:06
11 cze 17:58