callpseudo

call

pseudo
Asembler RISC-V Referencja

lyszt.net obejmuje call i inne instrukcje RISC-V w większych szczegółach.

Opis

call uruchamia funkcję i obsługuje powrót. Skacze do funkcji i zapisuje adres powrotu w ra, co pozwala funkcji wrócić. Jest to pseudoinstrukcja, która zwykle rozwija się do instrukcji poniżej.

jal ra, label

Gdy funkcja znajduje się zbyt daleko, aby pojedynczy skok mógł do niej dotrzeć, asembler zastępuje go dłuższą sekwencją, która pokonuje ten dystans. Zapisanie call z nazwą funkcji wyraża intencję i pozostawia wybór formy asemblerowi. Wpis jal opisuje skok i zapisanie adresu powrotu. Poniższa linia wywołuje funkcję square.

call square

Wywołanie funkcji wymaga również uzgodnienia sposobu przekazywania informacji między wywołującym a wywoływanym. Tym uzgodnieniem jest konwencja wywołań. Wywołujący umieszcza dane wejściowe funkcji w rejestrach argumentów, nazwanych a0, a1 i tak dalej, i odczytuje wynik z a0 po powrocie funkcji. Obie strony przestrzegają tej samej reguły, więc kod napisany osobno nadal ze sobą współpracuje.

Każde call nadpisuje ra. Funkcja, która sama wykonuje wywołania, zapisuje otrzymane ra przed ich wykonaniem, a następnie przywraca tę wartość przed własnym powrotem. Bez tego adres powrotu wewnętrznego wywołania zastępuje zewnętrzny i funkcja nie może wrócić. Funkcja, która niczego innego nie wywołuje, nie musi zapisywać ra.

Podręcznik RISC-V stwierdza, że standardowa konwencja wywołań oprogramowania używa x1 jako rejestru adresu powrotu. jal dociera do celów w zakresie plus lub minus 1 MiB, gdzie 1 MiB to 1 048 576 bajtów. Cel dalszy wymaga auipc, po którym następuje jalr, który dociera w dowolne miejsce w 32-bitowym zakresie adresów względnych wobec pc.

Przykład wywołuje square z 6 w a0 i po tym znajduje 36 w a0. Argument wchodzi, a wynik wychodzi przez konwencję.

Rozwija się do

jal ra, label

Asembler zastępuje tę pseudoinstrukcję rzeczywistą instrukcją lub instrukcjami wymienionymi powyżej.

Przykład

call square      # jumps to square; ra holds the return address