2013-10-28 3 views
0

내 자신의 ARM asm (32 비트 ARM/NEON)이 있습니다. 이 ASM 코드에서 나는 다음과 같이 C. 뭔가에서 구현되는 일부 기능을 호출 할 그것을 전화로 전환해야하는 일 ARM-ASM은 ConvolveC4는 Thumb2 것을 알고있는 경우ARM과 Thumb2 인터 워킹

 ARM 

NormCorrS0_S0_S0_ PROC 
     ... 
     BL  ConvolveC4 <-- implemented in C/C++ 
     ... 

1) 엄지 2?

2) ARM-asm이 ConvolveC4가 무엇인지 알지 못하는 경우 분명히 ARM asm이 그대로 유지되지만 ARM 상태가 올바르게 전환되도록 ConvolveC4 측면에 베니어를 추가해야합니다.

답변

1

BX 또는 BLX 또는 팔 팝 (ldm)에 따라 사용해야합니다. 링커에 따라 다르지만 링커는 ConvolveC4_from_arm을 추가합니다. 예를 들어, 기본적으로 링크 레지스터를 bl 다음에 반환 주소로 설정하지만 트램펄린은 모드를 전환합니다.

다른 접근법은 동일한 소스에서 함수를 호출하고 모드를 알고있는 경우가 아니라면 항상 blx 또는 bx를 사용하는 것입니다.

레이블/함수를 올바르게 선언하면 gnu 도구 인 binutils가이 중 일부를 처리 할 수 ​​있습니다.

+0

BLX (아키텍처 v5T 이상 Thumb2가있는 모든 프로세서 포함)가있는 프로세서에서는 링커 트램펄린/베니어가 필요하지 않습니다. 링크 타임 (link-time)에서 링커는 호출자와 호출 수신자의 명령어 세트를 알고 있으며 'BL'을 'BLX'로 적절하게 변경할 수 있습니다. armlink가이 작업을 수행합니다. GNU ld에 대해서는 잘 모르겠지만 같은 것을하기를 기대합니다. – scott

+0

어떤 어셈블러인지, 그리고이 사람이 사용하고있는 링커를 모르면이 모든 것을 알지 못할 수도 있습니다 ... –

+0

저는 Windows RT (microsoft)에서 armasm을 사용하고 있습니다. 컴파일러는 호출 대상에 따라 bl/blx를 자동으로 삽입합니다. 그러나 32 비트 ARM을 실행하는 방법을 알 수는 없습니다. Thumb2에는 아무런 문제가 없지만 ARM에서는 이상한 오류가 발생합니다 ... ARM은 하드웨어 수준에서 OS에 의해 비활성화 될 수 있습니까? – Pavel