2014-09-11 2 views
0

현재 ARM CM0 + 코어 및 IAR 컴파일러를 사용하여 프로젝트를 개발 중입니다. 컴파일러의 어셈블리 출력을 점검했을 때 "STRDEQ" "EORPL"등과 같은 이상한 명령어를 발견했습니다. 이러한 지시 사항은 ARM 설명서에 설명되어 있지 않습니다. 이 행동을 이해하는 사람이 있습니까?IAR ARM 컴파일러에 이상한 어셈블리 명령어가 있습니다.

감사합니다.

+0

ARM DDI 0100E 문서의 3.2 절 "조건 필드"를 참조하십시오. – Michael

답변

2

원래 ARM 명령어 세트는 대부분의 명령어를 조건부로 허용합니다. 이것은 이런 식으로 컴파일한다

if(c == x) 
    c = 0 

: 이는 주로 같은 경우에 사용된다

여기
cmp r0, r1 
moveq r0, #0 

실제 연산 코드 MOV이고 그것이 부착 된 상태를 가지고, 만 실행하는 것이 매우 전에 비교가 Z-Flag를 설정했을 때.

이렇게하면 분기 명령어가 저장됩니다. 그 뒤에있는 생각은 지점이 과거에는 상당히 비싼 작업이라는 사실에 기인합니다. 오늘날 우리는 더 나은 분기 예측과 투기 실행을 통해 이러한 종류의 최적화를 덜 효율적으로 수행합니다. ARM의 새로운 ISAs (Thumb1/2 및 AArch64)는 대부분의 명령어에 대한 조건부 실행을 더 이상 지원하지 않습니다. 주된 이유는 분기 예측이 더 뛰어나고 opcode 공간에서 매우 높은 비용입니다. 조건은 4 비트를 제거하는 opcode 내부에 인코딩되어야하는데 이는 상당히 많습니다. Thumb과 Thumb2에는 의사 명령어 IT (및 T (hen) 및 E (lse)가 다른 양의 변형이 있음)가 있으며, 조건부 명령어 이후에 명령어를 만들 수 있습니다.

그럼에도 불구하고 AFAIK Cortex M0 +는 ARM-ISA를 지원하지 않으며 Thumb의 IT 지침도 지원하지 않습니다. 어쩌면 컴파일러가 잘못된 타겟으로 설정되었을 수도 있습니다.