Wejście i wyjście
obsługuje całe wejście i wyjście. (wywołanie środowiskowe) prosi system operacyjny lub symulator o wykonanie usługi dla twojego kodu asemblerowego. Ekran i klawiatura to dwie z usług dostępnych w ten sposób.
Umieść numer usługi w a7, dowolny argument w a0, a następnie wywołaj . Usługi, które zna ten symulator:
1 # wypisz liczbę całkowitą (a0 = liczba)4 # wypisz łańcuch znaków (a0 = adres tekstu)5 # wczytaj liczbę całkowitą (wynik zwrócony w a0)10 # zakończ program32 # uśpij (a0 = milisekundy)
a7 = 1 wybiera usługę drukowania.
a7 określa, która usługa ma zostać uruchomiona, a a0 przenosi wszystko, czego ta usługa potrzebuje: wartość do wyświetlenia, adres, z którego ma odczytać dane, czas oczekiwania. Lista jest stała i krótka – zawiera pięć pozycji – więc opanowanie tej procedury raz wystarczy, by zrozumieć wszystkie sposoby, w jakie ten symulator komunikuje się ze światem zewnętrznym. Prawdziwy system operacyjny rozszerza tę samą koncepcję na znacznie dłuższą listę.li a7, 5 # wczytaj liczbę całkowitą -> a0ecalladd a0, a0, a0 # podwój jąli a7, 1 # wypisz liczbę całkowitąecallli a7, 10ecall
wybiera wczytywanie liczby całkowitej, a wstrzymuje działanie w oczekiwaniu na dane wejściowe, zwracając twoją liczbę w a0. dodaje a0 do siebie, podwajając je w miejscu. Następnie i wypisują wynik, a i kończą program. Gdy go uruchomisz, symulator wyświetli pole wprowadzania. Wpisz liczbę i zobacz, jak wraca podwojona.
Drukowanie tekstu
Najpierw dwa nowe pojęcia. Sekcja to oznaczony obszar programu: instrukcje znajdują się w sekcji .text, natomiast stałe dane, takie jak tekst, znajdują się w sekcji .data. Z kolei adres to po prostu liczba identyfikująca jedno miejsce w pamięci. Zamiast przenosić cały ciąg znaków, rejestr może przechowywać adres, pod którym zaczyna się ten ciąg, a funkcja drukowania odczytuje dane właśnie stamtąd.
Tekst trafia do sekcji danych. Przypisujesz mu etykietę, a następnie używasz ("load address"), aby załadować adres tej etykiety, i usługi 4, aby go wydrukować.
.datamsg: .string "Hello, RISC-V!\n".textla a0, msg # a0 = adres tekstuli a7, 4 # wypisz łańcuch znakówecallli a7, 10ecall
W .data dyrektywa rezerwuje miejsce na tekst i przypisuje etykietę msg. .string przechowuje znaki i dodaje \n, znak nowej linii. W .text umieszcza adres tekstu w a0, wybiera usługę drukowania łańcucha, a drukuje znaki z tego adresu, aż dotrze do końca łańcucha. Następnie program kończy działanie jak zwykle.
