auipc
lyszt.net은 auipc 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
인코딩 형식
설명
auipc는 add upper immediate to PC의 약자입니다. lui처럼 동작하며, 20비트 상수를 값의 상위 부분으로 취합니다. auipc는 그 값을 프로그램 카운터에 더합니다. 프로그램 카운터는 현재 실행 중인 명령어의 주소를 담고 있습니다(beq 페이지 참조). 결과는 이 명령어가 메모리 어디에 위치하는지를 기준으로 측정된 주소입니다.
상대 주소는 실제 문제를 해결합니다. 프로그램은 자신이 메모리 어디에 로드될지 항상 알지 못합니다. 고정된 절대 주소로 데이터를 참조하는 코드는 다른 곳에 로드되면 실패합니다. 현재 명령어를 기준으로 주소를 계산하는 코드는 어디에 배치되든 동작합니다. 이 성질을 위치 독립성이라고 합니다.
auipc는 그러한 주소의 거친 부분을 제공하고, 뒤따르는 명령어가 세밀한 12비트 나머지를 더합니다. 레이블의 주소를 로드하는 la 명령어는 이 쌍으로 구성되며, 멀리 있는 함수에 대한 호출도 마찬가지입니다.
RISC-V 매뉴얼에 따르면 auipc의 상수를 0으로 설정하여 현재 pc를 얻을 수 있습니다. auipc 뒤에 jalr이 오면 임의의 32비트 pc 상대 주소로 제어를 옮길 수 있고, auipc 뒤에 12비트 오프셋을 가진 로드나 스토어가 오면 임의의 32비트 pc 상대 데이터 주소에 접근할 수 있습니다.
la와 call은 auipc를 직접 작성하지 않아도 되도록 존재하며, 시뮬레이터의 트레이스와 디스어셈블된 코드에 자주 나타납니다. 작은 오프셋을 가진 명령어가 auipc 뒤에 와서 함께 하나의 주소를 형성하는 것은 알아두면 유용한 패턴입니다.
예시
auipc t0, 1 # t0 = pc + 0x1000
