Wejście i wyjście

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:

Usługi (a7)
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 program
32 # uśpij (a0 = milisekundy)
Wywołanie usługi
program
a71
a0wartość
ecall
systemwyświetla liczbę

a7 = 1 wybiera usługę drukowania.

Każda usługa korzysta z tego samego protokołu uzgadniania z dwoma rejestrami. 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ę.
Odczytaj liczbę, podwajaj ją i wyświetl
li a7, 5 # wczytaj liczbę całkowitą -> a0
ecall
add a0, a0, a0 # podwój ją
li a7, 1 # wypisz liczbę całkowitą
ecall
li a7, 10
ecall

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ć.

Witaj, RISC-V
.data
msg: .string "Hello, RISC-V!\n"
.text
la a0, msg # a0 = adres tekstu
li a7, 4 # wypisz łańcuch znaków
ecall
li a7, 10
ecall

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.