[기본원리] 분기문 에서의 프로그램 카운터 값

반응형





순차진행의 프로그램 에서는
프로그램 카운터의 값을 계속 1씩 증가하면서 실행된다고 했습니다.
[Programing/기본원리] - 프로그램 카운터가 본 프로그램 실행 원리


그렇지만 순차 진행과는 다르게 프로그램 안에 반복이나 분기문 (조건문 : if 등) 이 있다면 어떻게 될까요?
읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥



분기문에서의 프로그램 카운터 값

프로그램 안에서 반복이나 조건문을 만나면
프로그램 카운터의 값이 +1 이 아닌 다른 값으로 변경됩니다.

예를들어 프로그램 안에서
6과 3을 서로 비교하는 조건문을 만났다고 해보죠.

대략의 소스코드는 아래와 같습니다.

if( 6 > 3 ) {
    출력 6;
}



이런 코드를 만나면 프로그램 카운터는 어떻게 동작할까요?
이렇게 작동합니다 ^^;


비교에선 플래그 레지스터를 참조한다.

프로그램 카운터의 값 004 의 명령어가 참(true) 이면 프로그램 카운터의 값은 006으로 변경이 됩니다.
이렇듯 이동되는 명령어는 직전에 실행된 연산 결과를 참조하여 실행여부를 결정하게 되는데요,

CPU 안에 있는 플래그 레지스터가 이 역할을 합니다.

플래그 레지스터에는 방금전에 실행된 연산의 값, 즉 어큐물레이터의 값이 양수, 0, 음수 중 어떤 것인가를 기록합니다. CPU 가 연산을 실행할 때 마다 플래그 레지스터에 값이 등록되죠. 따라서 분기문 실행 이전에 일종의 비교연산이 이루어진다고 할 수 있습니다.

결국 프로그램 카운터의 점프 명령 실행 여부는 플래그 레지스터의 값을 참조하는 것이지요.
그리고 연산 결과가 양수, 0, 음수 중 어떤 것인가를 가지고 플래그 레지스터 안에서 세가지 비트로 나타냅니다



비교 연산은 실제로 빼기 연산으로!


예를들어 x > y 라는 비교가 있다면 CPU 의 연산장치는 내부적으로 빼기 연산을 실행합니다.
빼기로 비교를 어떻게 하냐고요?
아래를 잘 보세요!


x > y 는 실제적으로 x-y 가 됩니다.

이 결과를 플래그 레지스터에 기록하는데요,
결과가 양수라면 x 가 더 큰 경우이고 ( 6-3 = 3 : 양수 )
결과가 0이라면 같은 경우이고 ( 3-3 = 0 : 0 )
결과가 음수라면 x 가 더 작은 경우입니다 ( 2-3 = -1 : 음수 )


즉, CPU는 비교를 할 때 일반적인 수치화를 통해서 사용하는 것입니다.


위에서 언급했다 싶이 비교연산 결과를 플래그 레지스터에 세 비트로 저장한다고 했습니다.
저장되는 구조는 아래와 같습니다.








반응형

댓글

Designed by JB FACTORY