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 코드에 대해 완벽하게 작동? 감사!
M3에는 ARM 모드가 없습니다. 일부 32 비트 명령어가 포함 된 Thumb-2 명령어 세트를 지원합니다 (예 : http://www.arm.com/files/pdf/Cortex-M3_programming_for_ARM7_developers.pdf 참조). – Michael
이 조언은 [전체 * Cortex- M * 시리즈] (http://en.wikipedia.org/wiki/ARM_Cortex-M). 각 * Cortex-M * 변형에서 지원되는 특정 명령어가 여기에 제공됩니다. 모두 * Thumb/Thumb2 *; 즉 CPSR 비트 5가 설정되어 실행됩니다. –
분명한 질문은 _why_입니까? Thumb-2는 ARM ISA의 더 난해한 부분을 모두 포함합니다. 대부분의 ARM 어셈블리 코드는 조건부 실행을 과도하게 사용하지 않는 한 최소한의 조정만으로 변환해야합니다 (최신 코어의 ARM 모드에서도 차선책입니다). 컴파일 된 코드의 경우 명령어 세트가 문제가되지 않아야합니다. 틀림없이 M3는 Thumb-2의 하위 집합이지만 실종 된 DSP 요소 일뿐입니다. – Notlikethat