PC(Program Counter) 상대 주소는 컴퓨터 시스템에서 주소 지정 방식 중 하나로, 특정 명령어의 실행에 필요한 메모리 주소를 계산할 때 프로그램 카운터(PC) 값을 기준으로 한 상대적인 주소를 사용하는 방식입니다.
PC 상대 주소는 주로 분기(branch) 명령어에서 많이 사용됩니다. 분기 명령어는 프로그램이 특정 조건을 만족하면 실행 흐름을 다른 메모리 위치로 변경할 때 사용되는데, 이때 이동할 주소를 PC를 기준으로 상대적으로 지정할 수 있습니다.
예를 들어, 다음과 같은 분기 명령어가 있다고 가정합니다:
beq $t0, $t1, Label
$t0
와 $t1
레지스터가 같으면 Label
로 분기하는 명령입니다.Label
의 실제 메모리 주소를 명시하지 않고, 현재 명령어 주소(PC
)에서 Label
까지의 거리(오프셋)를 사용합니다.PC + 오프셋
이 되어 PC
에 저장된 값에서 지정된 오프셋만큼 이동하여 새로운 명령어로 점프합니다.코드 이식성: 절대 주소를 사용하지 않으므로, 프로그램이 다른 메모리 위치로 로드되더라도 분기 명령어는 여전히 올바르게 작동합니다. 이는 운영 체제가 프로그램을 다양한 메모리 위치에 로드할 수 있게 하고, 프로그램이 독립적인 메모리 공간에서 실행될 수 있도록 합니다.
메모리 효율성: PC 상대 주소 방식은 분기와 점프 명령에서 주소를 간단히 처리할 수 있어, 코드 크기를 줄이고 메모리 사용을 최적화할 수 있습니다.
동적 재배치: PC를 기준으로 하는 상대 주소 방식은 프로그램이 메모리 상에서 어느 위치에 로드되더라도 동일하게 동작하게 하며, 프로그램을 런타임에 재배치할 수 있습니다.
MIPS 어셈블리에서 PC 상대 주소는 보통 분기 명령어에서 사용됩니다. 예를 들어, 다음 MIPS 코드를 보세요:
beq $t0, $t1, label # t0와 t1이 같으면 label로 분기
add $t2, $t2, $t3 # 그렇지 않으면 이 명령어 실행
label:
sub $t4, $t5, $t6 # 분기 후 label에서 이 명령어 실행
여기서, label
로 분기하는 것은 PC + offset
으로 계산되며, 이는 절대 주소가 아니라 상대 주소로 지정됩니다.
PC 상대 주소는 프로그램의 명령어들이 실행되는 과정에서 PC 레지스터를 기준으로 한 오프셋을 사용하여 분기, 점프 등을 처리하는 방식입니다. 이를 통해 코드의 이식성을 높이고 메모리 효율성을 향상시킬 수 있습니다.