2010-01-20 2 views
10

내가 (ARM 플랫폼에서 주춤 6) 일부 C++ 코드를 디버깅하고, 의 행동과 내가 이상한 어떤 행동을 찾습니다이상한 LDR [PC, # VALUE]

4277220C mov   r3, #0x93, 30 
    42772210 str   r3, [sp] 
    42772214 ldr   r3, [pc, #0x69C] 
    42772218 ldr   r2, [pc, #0x694] 
    4277221C mov   r1, #0 
    42772220 ldr   r0, [pc, #0x688] 

라인 42772214 ldr r3, [pc, #0x69C] 일부 상수를 가져 오는 데 사용됩니다 .DATA 섹션에서 적어도 그렇게 생각합니다.

코드 r2에 따라 주소 pc = 0x42772214 + 0x69C = 0x427728B0의 메모리로 채워 져야하지만 0x427728B8 (8 바이트 +)에서로드 된 메모리 내용에 따라 다른 ldr 사용도 발생한다는 것은 이상한 일입니다.

디버거가 잘못되었거나 ldr/pc를 이해하고 있습니까? .data 섹션에 대한 액세스가 실행 된 코드와 관련된 이유는 무엇입니까? 나는 이상하게 생각한다.

그리고 또 하나의 문제는 : 내가 1 MOV 명령의 구문을 찾을 수 없습니다 속인 설명

죄송합니다 (하나는 엄지 손가락 (1C2)을 위해 나에게 optype 사양을 가리킬 수),하지만 난 그냥 익숙 해요 어셈블리와.

+0

'엄지 손가락'처럼 보이지 않지만 'ARM'코드와 같습니다.모든 명령어의 주소는 4 바이트 떨어져 있습니다 - 단지 4 바이트의 '엄지'명령어가 있습니다. –

+0

대부분의 아키텍처에서 명령어가 실행되기 전에 프로그램 카운터가 증가하는 것을 보았습니다. 명령 실행 중에 프로그램 카운터에는 현재 명령의 * end * 주소가 포함됩니다. –

답변

17

정확합니다. 판독을 위해 pc이 사용되면 ARM 모드에서는 8 바이트 오프셋이, Thumb 모드에서는 4 바이트 오프셋이 있습니다.

명령은 PC를 읽고

, 읽기 값이 의존하는 명령이에서 오는 설정 : 다음 ARM-ARM에서

에서 ARM 명령어를 들어

  • 값 읽기 명령의 주소 + 8 바이트입니다. ARM 명령어는 항상 워드로 정렬되므로이 값의 비트 [1 : 0]은 항상 0입니다.
  • Thumb 명령어의 경우 값은 명령어의 주소에 4 바이트을 더한 값입니다. Thumb 명령어는 항상 하프 워드로 정렬되기 때문에이 값의 비트 [0]은 항상 0입니다.

PC를 읽는 방법은 주로 프로그램 내의 위치 독립적 분기를 포함하여 주변 명령과 데이터를 신속하고 위치 독립적으로 주소 지정하는 데 사용됩니다.

PC 상대 주소 지정에는 두 가지 이유가 있습니다.

  1. 위치 독립적 인 코드입니다.
  2. 간단한 명령으로 작성할 수없는 복잡한 정수를 주변에서 가져옵니다. mov r3, #0x12345678은 1 명령으로 완료 할 수 없기 때문에 컴파일러는 함수의 끝에이 상수를 넣을 수 있습니다. 대신 ldr r3, [pc, #0x50]을로드하십시오.

내가 무엇 mov r3, #0x93, 30 방법을 모른다. 아마도 그것은 mov r3, #0x93, rol 30입니다 (이것은 0xC0000024)?

+3

'mov r3, # 0x93, 30'은 실제로'mov r3, # 0x93, ror 30'을 의미하며'0x24c '를 의미합니다. –

+1

@Mike - 좋은 설명과 ARM ARM을 인용 좋은. ARM 3 단계 파이프 라인에서 PC는 항상 가져 오는 명령어를 가리키고 PC-4는 디코딩되는 명령어를 가리키며 PC-8은 현재 명령어, 즉 실행중인 명령어입니다. 또한 예외가 반환하기 전에 LR 값을 조정해야하는 이유이기도합니다. 언급했듯이 이것은 ARM (32 비트) 명령어에 적용되므로 파이프 라인 단계마다 4 바이트 조정이 적용됩니다. – Dan