Programowanie
Mips: Witam, programował ktoś może w Asemblerze MIPS? Miałbym parę pytań
9 cze 20:15
Metis: Asembler?
Czarną magią się nie zajmujemy.
9 cze 20:18
Mips: Aż taka czarna to ona nie jest
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ą.
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
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
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
Stringa odwróciłem, ale nadal mam problemy z zamianą liter.
11 cze 00:36
Mips: up
11 cze 12:47
Mips: up
11 cze 16:06
11 cze 17:58