Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

학부생 CS/컴퓨터 시스템 설계

Computer System Design - 7 : Thumb, Thumb2

sm_amoled 2019. 5. 20. 16:12

 

ARM은 세 가지 Instruction Set을 제공한다. 

        ARM ISA : 32bit Instruction

        Thumb2 : 16bit & 32bit Instruction 

                Thumb은 16bit Instruction으로 구성되어있고, 이를 확장하여 32bit Instruction을 덧붙여 Thumb2를 제공한다.

                Special Perpose의 Embedded System을 목적으로 디자인되었다.

                따라서, Reduced-Cost Row-Performance를 만족시키기 위해 Low memory Set을 제공한다.

        Jazelle : Java ByteCode ( ByteCode 실행에 JVM이 필요없다 )

 

CPSR의 J,T bit을 통해 어떤 Inst Set으로 번역될 지 설정 가능하다.

Compiler가 알아서 CPSR을 처리해준다.

        Assembly Code에서 ".thumb", ".thumb_func" 를 작성해주면 명령어 아래 코드가 thumb모드로 번역된다.

        C Code에서 "#pragma GCC target ("thumb")를 전처리구문에 넣어주면 thumb모드로 번역된다.

 

ARM 모드와 Thumb2 모드 사이를 이동하기

        BX, BLX : Branch Exchange ( Jazelle은 bxj라는 다른 instruction을 사용한다. )

                Interworking을 하면 CPSR의 J, T값이 바뀌어야 하므로 변환이 진행됨을 알리기 위해 Instruction을 사용한다.

        BX를 실행하면 ( target 이 thumb mode일 때 ) Linked Register ( LR ) 의 Last Bit이 1이 된다.

                Instruction의 주소는 항상 2의 배수 -> Last Bit은 원래 항상 0이다. ... 이 값이 1이 된다!

                그렇다 하더라고, BX LR 명령어로 다시 돌아올 때는 LR가 정상적인 값으로 돌아온 상태로 반영된다.

                PC의 값은 그대로 짝수가 유지된다.

        

Thumb Instruction 의 조건문

        Thumb Code는 Condition을 제공하지 않는다. ( 16bit Instruction - Cond를 담기에는 너무 부족하다 )

                ( Condition : eq, ne, gt, lt 같은 cmp나 -s 명령어를 통해 NZCV Flag 와 비교하여 실행하는 조건문 )

        이로인해, Condition 을 적용시켜줄 다른 방법을 마련해둔다. 

                CPSR의 IT 공간에 정보를 담아둔다.

                 Inst의 [ firstcond, mask ] 8 bit과 IT 8 bit을 비교하여 수행여부를 결정하고 일련의 과정을 수행한다.

 

        IT Instruction을 사용 ( If then ) -> CPSR IT Field에 값을 저장할 수 있다.

                IT + T / E를 조합하여 작성 가능하다. (  ex) ITTEE : If then then else else, ITEE : if then else else, ITTTT, IT ... )

                        -> 조건에 따른 명령어 수의 합은 최대 4개이다.

 

        IT Inst 작동방법 ( 내부적으로 작동 -> 직접 할 필요 없지만 알아두자는 의미 )

                 IT(~)와 Cond를 CPSR의 IT Field에 Set한다.  (ex) ITTEE EQ : IT : 0000_0111 - EQ 가 0000, 0 1 1 1 = T E E LastBit( 1 ) )

                이후 Inst를 실행할 때 마다 firstcond의 마지막 bit을 날리고 mask bit을 한 칸 씩 앞으로 Logic Shift Left 해준다.

                        ex) Inst 하나씩 수행 => IT Bit을 Update한다.

                                ( 0000_1110 -> 0001_1100 -> 0001_1000 -> 0000_0000 ) 1이 하나 남으면 0으로 바꾸고 End 시켜준다.

                                0000이 EQ / 0001는 NE에 해당한다. => 이렇게 디자인 되어있기에 마지막 bit이 1이 되면 Else를 수행한다.

                                       ( Greater Than /  Less or Equal : then과 else의 관계 -> 1bit 차이난다. )

               이후 바뀐 firstcond 4자리를 CPSR의 NZCV값과 비교하여 수행 여부를 결정한다.

 

        IT Inst 사용방법

                MOV R0, #1

                CMP R0, #0            비교 -> CPSR의 NZCV가 Set된다.

                ITTEE EQ                CPSR의 IT Field가 Set된다.

                ADDEQ R0, #1         then

                ADDEQ R0, #2        then

                ADDNE R0, #3        else

                ADDNE R0, #4        else

                

IT Block 내에서 CPSR의 NZCV를 update하는 inst를 수행하면 Flag가 바뀐 채 Instruction이 수행된다. 

        이것이 바로 code smell이다. 이렇게 코드를 작성하면 회사에서 잘리지 않을 수 있는 나만 알아보는 코드가 된다!

Nested IT Block은 Compiler가 Error처리를 한다.

 

 

// 이 시리즈의 글들은 고려대학교의 Computer System Design 과목 ( COSE321 ) 을 수강하며 제가 공부한 내용입니다.

// 노트필기를 바탕으로 정리하여 올리고 있으므로, 부정확한 정보가 있을 수도 있습니다.

// 추후에 종강을 하면 워터마크를 삽입한 최종노트 PDF를 첨부할 계획입니다.

 

320x100