View
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를 첨부할 계획입니다.
'학부생 CS > 컴퓨터 시스템 설계' 카테고리의 다른 글
Computer System Design - 9 : IO Interrupt (0) | 2019.05.21 |
---|---|
Computer System Design - 8 : Interrupt Input (0) | 2019.05.20 |
Computer System Design - 6 : Timer (0) | 2019.05.20 |
Computer System Design - 5 : Handling IO Device in Software (0) | 2019.05.20 |
Computer System Design - 4 : Memory Map (3) | 2019.04.06 |