2011-02-13 1 views
1

특히 BLX RX 명령어와 관련된 ARM BLX 명령어에 대한 질문이 있습니다. ARM 설명서에서 BLX 레이블의 경우 label은 32MB 범위 내에 있어야합니다. 내 코드에서는 address1을 가리 키도록 R0 레지스터를 설정했습니다. 내 현재 주소와 주소 1 (대상 주소) 사이의 거리는 약 0x05000000입니다.ARM BLX 명령어 범위 (절대)

내가 명령에 도달하면 충돌합니다 (address1의 코드는 ARM이므로 T- 모드에서는 문제가 없습니다). BLX에서 절대 값을 사용할 때 제한이 있습니까? 비니어를 사용해야합니까?

감사합니다.

답변

2

임의의 주소를 BLX RX 형식의 RX 레지스터로 사용할 수 있습니다. 팔 팔에서 설명한 작업을 수행합니다. 코드의 어느 것도, 전화 또는 코드가 호출되지되는 경우

 
if ConditionPassed(cond) then 
    target = Rm 
    LR = address of instruction after the BLX instruction 
    CPSR T bit = target[0] 
    PC = target AND 0xFFFFFFFE 

당신은 아마 괜찮 다음 엄지 손가락 모드, 경우에 당신이 제로입니다 제공 주소의 lsbit을 확인하십시오. 실제로 0x05000000에 코드가 있어야하며 분기 링크를 처리하기 위해 코드 의도가 있어야합니다. 즉, bl 스타일 호출이 많을 경우 링크 레지스터 (r14)를 유지 관리합니다. 마찬가지로 누군가 다른 사람으로부터 호출 된 함수 내에서 blx 호출을 작성하는 경우 blx 호출을 작성하고 r14를 복원하기 전에 r14를 보존해야하거나 함수에서 반환 할 때 그 값을 r15 (pc)에 다시 저장해야합니다.

해시/objdump 목록의 코드 예 또는 스 니펫은이 문제를 해결하는 데 도움이됩니다. blx와 코드가 포함 된 코드.

0

제한은 레지스터 기준이 아닌 PC 기준 분기에만 적용됩니다 (명령에서 인코딩 된 오프셋이 있음).

그래서 충돌의 원인은 다른 것입니다. 귀하의 프로세서는 무엇입니까? 실제로 'address1'에 코드가 있습니까? 정확히 어디에서 충돌이 발생합니까?