mvpseudo

mv

pseudo
Asembler RISC-V Referencja

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