2012-06-26 2 views
0

인라인 어셈블리에서 전역 변수를 사용하려고합니다.Greenhills 컴파일러의 인라인 어셈블리에서 전역 변수를 사용하는 방법?

asm ("LDR R0, g_TsInitStackPointerAddress");

여기서 g_TsInitStackPointerAddress는 전역 변수입니다. 컴파일 중 오류를 표시하지 않습니다.

하지만 연결하면서 다음 오류를 도시

[elxr]의 범위의 출력 (에러) 재배치 타입 R_ARM_POOL을 수행하는 동안 (부호) 0x1001326 12 비트에 맞지 않았다 (4)에서 g_TsInitStackPointerAddress + 0x0으로 ((공통) + 0xb6)에

여기 내 함수 이름 InitStack입니다 0x10013e0 InitStack +에서가 0x20 (drv.o (는 .text) + 0x1a4)를 해결하고 이름은 DRV입니다 파일. 오류를 이해할 수 없습니다. 사용

프로세서 : 코어 텍스 R4
컴파일러 : ("DCD g_TsInitStackPointerAddress g_TsInitStackPointerAddress_a"); 그린힐

+0

에서 그 변수를 할게요 그 함수 내에서이 문장을 지정 그것은 당신의 변수가 너무 작은 것 같다? R0 레지스터의 크기와 변수의 크기를 확인해야합니다. – RedX

답변

0

는 솔루션을

__asm있어

다음은 인라인 어셈블리

+0

더 안전한 방법은 다음과 같이'ldr ='의사 명령어를 사용하는 것입니다 : http://blogs.arm.com/software-enablement/251-how-to-load-constants-in -assembly-for-arm-architecture/이렇게하면 어셈블러가 상수 풀을 배치 할 위치를 결정할 수 있습니다 (예 : 함수가 끝난 후). 수동으로 직접 배치해야합니다. – Quuxplusone

관련 문제