View

300x250

 

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
Share Link
reply
반응형
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30