2014-04-10 4 views
2

Cortex M3에서 실행하려고하는 ARM 코드가 있습니다. Thumb으로 작성된 대다수의 코드는 C에서 컴파일되었지만 일부 함수의 경우 일반 ARM 코드를 실행할 수 있기를 원합니다 (M3에서이 코드를 이해할 수 있습니까?).Cortex M3의 비 Thumb ARM 코드

그래서 ...

원래 C 코드 및 조립 :

int donothing(int a) { 
    return a; 
} 


00000068 <donothing>: 
    68: e52db004 push {fp}  ; (str fp, [sp, #-4]!) 
    6c: e28db000 add fp, sp, #0 
    70: e24dd00c sub sp, sp, #12 
    74: e50b0008 str r0, [fp, #-8] 
    78: e51b3008 ldr r3, [fp, #-8] 
    7c: e1a00003 mov r0, r3 
    80: e28bd000 add sp, fp, #0 
    84: e8bd0800 ldmfd sp!, {fp} 
    88: e12fff1e bx lr 

blx r4와이에 arm-none-eabi-gcc -mfloat-abi=soft -nostdinc -nostdlib

I 분기를 사용하여 컴파일 - 기본 주소 경우 교환해야 & 3 0 , 그것이있다.

GDB에서이 단계를 거치면 주소에 올바른 데이터가 포함되어 있어도 표시된 줄이 나타나 자마자 HardFaults가 표시됩니다. (BLX와)

(gdb) p/x *0x2000934c 
$2 = 0xe52db004 

코드는 무슨 일이야

어떤 생각 ...하지만 Thumb 코드에 대해 완벽하게 작동? 감사!

+5

M3에는 ARM 모드가 없습니다. 일부 32 비트 명령어가 포함 된 Thumb-2 명령어 세트를 지원합니다 (예 : http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf 참조). – Michael

+0

이 조언은 [전체 * Cortex- M * 시리즈] (http://en.wikipedia.org/wiki/ARM_Cortex-M). 각 * Cortex-M * 변형에서 지원되는 특정 명령어가 여기에 제공됩니다. 모두 * Thumb/Thumb2 *; 즉 CPSR 비트 5가 설정되어 실행됩니다. –

+0

분명한 질문은 _why_입니까? Thumb-2는 ARM ISA의 더 난해한 부분을 모두 포함합니다. 대부분의 ARM 어셈블리 코드는 조건부 실행을 과도하게 사용하지 않는 한 최소한의 조정만으로 변환해야합니다 (최신 코어의 ARM 모드에서도 차선책입니다). 컴파일 된 코드의 경우 명령어 세트가 문제가되지 않아야합니다. 틀림없이 M3는 Thumb-2의 하위 집합이지만 실종 된 DSP 요소 일뿐입니다. – Notlikethat

답변

5

Cortex-M 프로세서는 ARM 모드 명령어를 지원하지 않습니다. 16 비트 및 32 비트 명령어가 혼합 된 Thumb-2 만 지원합니다. Cortex-M에서 ARM 명령어를 실행할 수있는 방법은 없습니다.