mv
pseudolyszt.net obejmuje mv i inne instrukcje RISC-V w większych szczegółach.
Opis
mv kopiuje wartość jednego rejestru do drugiego. Nazwa jest skrótem od move (przenieś). Po poniższej linii oba rejestry przechowują tę samą wartość, a źródło, t0, pozostaje niezmienione.
mv a0, t0
mv to pseudoinstrukcja. Asembler przepisuje tę czytelną nazwę na rzeczywistą instrukcję, pokazaną poniżej.
addi rd, rs, 0
Dodanie zera do wartości i zapisanie jej gdzie indziej tworzy kopię. RISC-V nie ma dedykowanej instrukcji przenoszenia i zamiast tego używa dodawania.
Różne rejestry mają różne zadania, co jest zwykłym powodem używania mv. Zgodnie z konwencją obliczenia odbywają się w rejestrach tymczasowych (t0, t1 itd.). Gdy wywoływana jest funkcja, jej argumenty trafiają do określonych rejestrów (a0, a1 itd.), a wyniki wracają w a0. Dlatego program umieszcza mv przed wywołaniem, co umieszcza obliczoną wartość w rejestrze odczytywanym przez wywoływany kod, oraz mv po wywołaniu, co zapisuje zwrócony wynik w bezpiecznym miejscu.
mv a0, t0 call square mv s0, a0
Umieszczanie wartości w odpowiednich rejestrach w odpowiednim momencie to duża część asemblera, a mv to robi.
Podręcznik RISC-V stwierdza, że addi ze stałą 0 implementuje pseudoinstrukcję asemblera mv.
Ponieważ mv kopiuje wartość, późniejsza zmiana miejsca docelowego pozostawia źródło niezmienione. Czyni to mv przydatnym do zachowania kopii wartości, zanim pętla zmieni oryginał. Ślad symulatora pokazuje addi, które wykonuje się zamiast mv.
Rozwija się do
addi rd, rs, 0
Asembler zastępuje tę pseudoinstrukcję rzeczywistą instrukcją lub instrukcjami wymienionymi powyżej.
Przykład
li t0, 42 mv t1, t0 # t1 = 42
