2016-06-15 3 views
0

ARM 및 Thumb2 명령 : LDR 및 LDR.W, PC = 특정 주소로 절대 점프하기위한 ADDR에 관심이 있습니다.Thumb과 ARM 간 이동

예를 들어 ARM 코드에서 ARM으로 건너 뛰면 LDR PC = ADDR 명령이 수행됩니다. 하지만 다른 시나리오에서는 어떻게됩니까? ARM으로부터

는 +1 어드레스에 추가 될 필요

를 아암 Thumb2

Thumb2에서

에 Thumb2에서

를 Thumb2 하는가? 그리고 왜?

답변

0

규칙은 실제로 매우 간단하다 : 어드레스의 비트 0이 0 인 경우

  • 상기 CPU는 ARM 코드로 코드를 실행할
  • 어드레스의 비트 1이 1 인 경우, CPU 것 Thumb으로 코드 실행
  • 물론 코드가 일치하지 않으면 코드가 ARM인지 Thumb인지를 확인할 방법이 없으므로 CPU에 확실하게 오류 (임의 코드 실행 후)가 표시됩니다.

이것은 +1에 대해 설명합니다.

컴파일러에 따라 사용되는 레이블에 따라 주소의 비트 0이 컴파일러에서 자동으로 설정 될 수 있습니다.

+0

그 뜻은'| 컴파일러가 이미 주소를 조정했다면 '1'은'+ 1'보다 나은 접미사가 될 것입니다. –

+0

네, 컴파일러가 이미 그것을 설정했기 때문에 OR이 쓸모가 없다는 것을 제외하고는 그렇습니다. – Dric512

+0

그래서 : 불필요한'OR', _assembly_ 시간에 완료; 또는 잘못된 유형의 코드를 실행하여 끔찍한 사고가 발생합니다. 나는 내가 무엇을 원하는지 알고 있다고 생각한다. –

0

설명서를 읽는 것만으로도됩니다.

The following instructions write a value to the PC, treating that value as an interworking address to branch 
to, with low-order bits that determine the new instruction set state: 
— BLX (register), BX , and BXJ 
— LDR instructions with <Rt> equal to the PC 
— POP and all forms of LDM except LDM (exception return), when the register list includes the PC 
— in ARM state only, ADC , ADD , ADR , AND , ASR (immediate), BIC , EOR , LSL (immediate), LSR (immediate), MOV , 
MVN , ORR , ROR (immediate), RRX , RSB , RSC , SBC , and SUB instructions with <Rd> equal to the PC and without 
flag-setting specified. 

엄지 손가락 2는 armv6 이상을 언급했기 때문에. (당신은 thumb2와 총칭하여 엄지 손가락을 말했습니까?) 나는 armv6과 armv7에 위가 적용된다고 문서가 믿고 있다고 생각합니다.

비트는 명령어에 의해 소비되고, PC는 엄지 모드에서 세트 비트를 전달하지 않으며, 명령어에 의해 모드 변경을 나타 내기 위해 사용됩니다.

또한 OR 1은 플러스 1이 아닙니다. 코드를 올바르게 작성하면 툴체인이 정확한 주소를 올바른 lsbit로 제공하며, 해당 주소에 주소를 추가하면 코드, 당신이 편집증 환자이거나, 제대로하지 않았다면, 주소에 하나 또는 주소를 입력 할 수 있습니다. 이미 문제가 없다면, 문제가 해결되면 문제가 해결됩니다. 엄지 손가락 모드로 전환하는 것에 관해서는 플러스를 사용하지 않을 것입니다.

+0

팔 문서의 psuedo 코드가 잘못되었다는 것에 동의 할 것이고,이 비트와 관련하여 잘라 내기 및 붙여 넣기 오류가 발생한다는 것에 동의 할 것이다. 그들은 거의 항상 가지고있다. –