Robienie matematyki
Wszystkie obliczenia odbywają się między rejestrami. Instrukcja arytmetyczna podaje najpierw miejsce docelowe, a następnie dwa źródła, które odczytuje: oznacza dest = src1 + src2.
add umieszcza t0 + t1 w t2.
t0 i t1, zawsze w tej kolejności. Wchodzą w ten sam kształt niezależnie od wykonywanej operacji: dodawania, odejmowania, mnożenia, dzielenia lub reszty. Wchodzą dwie wartości, zachodzi jedna operacja i wychodzi jeden wynik do t2 po prawej. wymienia t2 jako pierwsze, ponieważ tam trafia wynik, co odpowiada jedynej regule kolejności, której przestrzega każda instrukcja arytmetyczna w tej lekcji.Dodawanie i odejmowanie
pobiera liczby przechowywane w dwóch rejestrach i zapisuje ich sumę w trzecim. robi to samo dla odejmowania: oblicza t0 - t1. Obie instrukcje czytają wyłącznie z rejestrów.
add t2, t0, t1 # t2 = t0 + t1sub t2, t0, t1 # t2 = t0 - t1
Jedna rzecz do zapamiętania: rejestr przechowuje tylko 32 bity, więc istnieje górny limit. Jeśli wynik jest zbyt duży, aby się zmieścić, nie jest zgłaszany żaden błąd. Wartość po cichu zawija się do bardzo małych liczb i wykonanie jest kontynuowane. Codzienne wartości nie osiągną tego limitu, ale warto o tym wiedzieć.
Aby użyć stałej liczby zamiast drugiego rejestru, dodaj literę i, która oznacza natychmiastowy: dodaje stałą 1. Nie ma subi, więc aby odjąć stałą, dodaje się liczbę ujemną: .
Mnożenie i dzielenie
mnoży dwa rejestry. dzieli je jako liczby całkowite i odrzuca ułamek, więc 7 / 2 daje 3. zwraca resztę, więc 7 % 2 daje 1. Dzielenie nigdy nie powoduje awarii. Dzielenie przez zero zwraca -1.
mul t2, t0, t1 # t2 = t0 * t1div t2, t0, t1 # t2 = t0 / t1 (całkowite)rem t2, t0, t1 # t2 = t0 % t1 (reszta)
Łączenie elementów
li t0, 7li t1, 5add t1, t0, t1 # t1 = 7 + 5 = 12mv a0, t1 # usługa wypisywania odczytuje a0li a7, 1ecallli a7, 10ecall
ładuje 7 do t0. ładuje 5 do t1. dodaje je i zapisuje 12 do t1. kopiuje wynik do a0, ponieważ usługa drukowania zawsze odczytuje swoją wartość z a0. Następnie wybiera usługę drukowania liczby całkowitej, a ją uruchamia. Na koniec i kończą program.
Dodatkowe zadanie: mnożenie z przesunięciami
Gdy czynnik jest potęgą dwójki, istnieje szybsza metoda niż . (przesunięcie logiczne w lewo) przesuwa bity rejestru w lewo, a każde przesunięte miejsce podwaja wartość: przesuń o 1, aby pomnożyć przez 2, o 2 dla 4, o 3 dla 8. Przesunięcie kosztuje mniej niż mnożenie, więc kompilatory często go używają.
li t0, 5 # zacznij od 5# przesunięcie w lewo o 3 bity (5 * 2^3 = 5 * 8)sll a0, t0, 3 # a0 = 40li a7, 1 # wypisz liczbę całkowitąecallli a7, 10ecall
umieszcza 5 w t0. przesuwa jego bity o trzy miejsca w lewo. Każde miejsce podwaja wartość, więc 5 podwaja się trzy razy (5, 10, 20, 40), dając 40 w a0. Reszta przebiega według wzorca drukowania z wcześniej. Spróbuj zmienić 3 na 1 lub 2 i przewidź wynik, zanim go uruchomisz.
5 przesunięte w lewo o 0 bitów pozostaje 5.
