auipc
lyszt.net obejmuje auipc i inne instrukcje RISC-V w większych szczegółach.
Format kodowania
Opis
auipc oznacza add upper immediate to PC. Działa jak lui, przyjmując 20-bitową stałą jako górną część wartości. auipc dodaje tę wartość do licznika programu, który przechowuje adres aktualnie wykonywanej instrukcji (zobacz stronę beq). Wynikiem jest adres mierzony względem miejsca, w którym ta instrukcja znajduje się w pamięci.
Adresy względne rozwiązują realny problem. Program nie zawsze wie, gdzie w pamięci zostanie załadowany. Kod, który odwołuje się do swoich danych za pomocą stałych adresów bezwzględnych, zawodzi, gdy zostanie załadowany gdzie indziej. Kod, który oblicza adresy względem bieżącej instrukcji, działa wszędzie tam, gdzie zostanie umieszczony. Ta właściwość nazywa się niezależnością od pozycji.
auipc dostarcza zgrubną część takiego adresu, a następna instrukcja dodaje drobną 12-bitową resztę. Instrukcja la, która ładuje adres etykiety, jest zbudowana z tej pary, podobnie jak wywołania odległych funkcji.
Podręcznik RISC-V mówi, że bieżący pc można uzyskać, ustawiając stałą auipc na 0. auipc po którym następuje jalr, może przekazać sterowanie do dowolnego 32-bitowego adresu względnego od pc, a auipc po którym następuje ładowanie lub zapis z 12-bitowym przesunięciem, może uzyskać dostęp do dowolnego 32-bitowego adresu danych względnego od pc.
la i call istnieją po to, abyś nie musiał pisać auipc ręcznie, a pojawia się on często w śladzie symulatora i w kodzie zdeasemblowanym. auipc po którym następuje instrukcja z małym przesunięciem, tworzące razem jeden adres, to użyteczny wzorzec do rozpoznania.
Przykład
auipc t0, 1 # t0 = pc + 0x1000
