인프런 커뮤니티 질문&답변

김상현님의 프로필 이미지
김상현

작성한 질문수

ARM Cortex-M 프로세서 프로그래밍

s325_BRANCH 명령어

ARM, thumb, thumb2 관련 질문 드립니다.

해결된 질문

작성

·

1.2K

1

안녕하세요. 강사님. 강의 잘 보고 있습니다. 질문이 있는데요.

ARM 명령어와 thumb명령어가 존재하는 프로세서는 branch할 때 주소의 LSB의 값을 보고 해당 주소의 명령어가 thumb인지 ARM 명령어인지 구분한다고 이해하고 있습니다.

ARM 명령어는 32비트이고 thumb 명령어는 16비트라 명령어 구조가 달라 구분이 필요하다고 생각합니다.

여기서 질문이 있는데요.

1. thumb2 명령어는 32비트 명령어로 알고 있습니다.

그러면 thumb 명령어와 thumb2 명령어의 구조 또한 다를텐데 이 둘은 구분이 따로 필요 없는건가요?

강의를 보면 thumb 명령어나 thumb2 명령어나 주소로 branch할 때 무조건 1을 더하라고 말씀하셔서요.

 

2. 작성된 코드를 컴파일러가 어셈블리언어로 변환하는데, 이 때 컴파일러의 판단?에 따라 thumb명령어와 thumb2 명령어가 섞일 수 있는 것으로 알고 있습니다.

만약 thumb와 ARM 명령어를 지원하는 프로세서에서는 컴파일할 때 thumb 명령어와 ARM명령어가 섞일 수 있나요?

아니면 명시적으로 이 부분은 ARM 혹은 thumb 명령어로 컴파일하라고 명시적으로 지시해야하는 건가요?

 

3. 2번 질문에서 컴파일러에 따라 ARM 명령어와 thumb 명령어가 섞인다면 어셈블리어로 프로그램을 작성할 때, branch 명령어를 사용할 때 문제가 있지 않나요?

예를 들어

adr r0, function1

blx r0

위처럼 작성을 했을 때, 컴파일러가 function1을 ARM 명령어로 컴파일할지, thumb명령어로 컴파일할지에 따라 Hardfault 익셉션이 발생할 수도 있을 것 같아서요.

답변 1

0

홍영기님의 프로필 이미지
홍영기
지식공유자

안녕하세요. 김상현님

안녕하세요. 강사님. 강의 잘 보고 있습니다. 질문이 있는데요.

ARM 명령어와 thumb명령어가 존재하는 프로세서는 branch할 때 주소의 LSB의 값을 보고 해당 주소의 명령어가 thumb인지 ARM 명령어인지 구분한다고 이해하고 있습니다.

ARM 명령어는 32비트이고 thumb 명령어는 16비트라 명령어 구조가 달라 구분이 필요하다고 생각합니다.

여기서 질문이 있는데요.

1. thumb2 명령어는 32비트 명령어로 알고 있습니다.

그러면 thumb 명령어와 thumb2 명령어의 구조 또한 다를텐데 이 둘은 구분이 따로 필요 없는건가요?

강의를 보면 thumb 명령어나 thumb2 명령어나 주소로 branch할 때 무조건 1을 더하라고 말씀하셔서요.

(ANS)

모든 ARM 프로세서(CORTEX-A/R/M 포함) 는 머신코드 LSB 값이 0 혹은 1 인지를 보고 ARM 명령어 혹은 THUMB 명령어를 구분합니다. CORTEX-M 의 경우는 애초에 ARM 명령어를 지원하지 않기에 LSB 는 항상 '1' 값을 가집니다(THUMB 과 THUMB2 모두). 컴파일러가 코드를 생성해 줄때 이 LSB 의 올바른 값을 만들어내겠죠. 프로세서는 RUNTIME 시에 머신코드의 구조를 보고 THUMB 인지 THUMB2 인지를 실시간으로 판단해 냅니다.

2. 작성된 코드를 컴파일러가 어셈블리언어로 변환하는데, 이 때 컴파일러의 판단?에 따라 thumb명령어와 thumb2 명령어가 섞일 수 있는 것으로 알고 있습니다.

만약 thumb와 ARM 명령어를 지원하는 프로세서에서는 컴파일할 때 thumb 명령어와 ARM명령어가 섞일 수 있나요?

아니면 명시적으로 이 부분은 ARM 혹은 thumb 명령어로 컴파일하라고 명시적으로 지시해야하는 건가요?

(ANS)

LEGACY ARM 이나 CORTEX-A/R 프로세서는 ARM 명령을 사용할 수가 있을 텐데요. 일반적으로 개발자가 컴파일러에 이 소스코드는 .code ARM 으로 컴파일하고, 저 소스코드는 .code THUMB 으로 컴파일하라고 지시하여 빌드과정이 진행되게 됩니다. 단, BOOT 코드나 익셉션 핸들러의 경우는 꼭 ARM 명령어로 작성하여야 합니다(요구사항).

3. 2번 질문에서 컴파일러에 따라 ARM 명령어와 thumb 명령어가 섞인다면 어셈블리어로 프로그램을 작성할 때, branch 명령어를 사용할 때 문제가 있지 않나요?

예를 들어

adr r0, function1

blx r0

위처럼 작성을 했을 때, 컴파일러가 function1을 ARM 명령어로 컴파일할지, thumb명령어로 컴파일할지에 따라 Hardfault 익셉션이 발생할 수도 있을 것 같아서요.

(ANS)

맞습니다^^. 그래서 ARM 과 THUMB 이 혼합된 형태의 프로그램에서는 분기문이나 함수 호출시 해당 코드(callee)가 ARM / THUMB 인지에 따라 LSB 를 각각 0 과 1의 형태로 분기할 수 있도록 해야합니다.

@ ARM 명령의 경우

adr r0, function1

bx r0

@ THUMB 명령의 경우

adr r0, function1+1

bx r0

김상현님의 프로필 이미지
김상현

작성한 질문수

질문하기