2013-08-20 2 views
2

r1 레지스터에 값이로드되는 주소는 어떻게 계산됩니까?ARM 어셈블리의 프로그램 카운터

_start: 
    ldrh r1, [pc, #6] 

PC = 8054합니다 (ldrh 명령의 어드레스)

날에 따르면, 상기 어드레스의 값이 있어야 값 : PC는 + 6 = 805A

그래서 그것은로드해야 값 805A에서 레지스터 r1로.

답변

5

그것은 당신이 ARM 또는 Thumb 모드에있어 여부에 따라 달라집니다. ARM 모드의

:

기본으로 R15를 사용하여 당신이 현재 명령어의 주소에서 주소를 8 바이트를 포함 기억해야 등록합니다.

의 Thumb 모드의

:

PC 값이 명령어의 주소가 4 바이트보다 클 것이지만, PC의 1이되도록 0으로 강제되는 비트 정렬 된 단어 .

+0

나는 ARM 모드입니다. R15 (또는 PC)는 ARM 모드에서 4 바이트 레지스터이므로 4 바이트 (32 비트 주소)를 포함합니다. 위에서 언급 한 어셈블리 언어 지침과 PC의 가치에 대해 구체적으로 말할 수 있습니까? PC를 4의 배수로 증가시켜야하는데 왜 6이 더 해지는지 잘 모르겠습니다. –

+1

'PC '는 프로세서가 수행 한 프리 페치로 인해 현재 명령어보다 두 개 앞선 명령어입니다. ARM 모드에서는 8 바이트를 의미하고 Thumb 모드에서는 4 바이트를 의미합니다. 만약 'LDRH' 명령어가 0x8054 번지에 있고 6 바이트의 즉각적인 오프셋을 사용한다면 0x8054 + 8 + 6 == 0x8062 번지에서로드됩니다. – Michael

+0

감사합니다. 이 바이너리를 디버깅 할 때 ldrh 명령에서 레지스터 내용을 확인하면 PC 레지스터의 값이 0x8054로 표시됩니다. 왜 이렇게이다? 현재 명령어가 실행되기 직전에 PC의 값은 = (현재 명령어의 주소 + 8) 값을 가져야합니다. –