임베디드랜드


----------------------------------------------------------------------
                     ARM7 강좌 [7] : Instruction Set(1)
----------------------------------------------------------------------

* ARM7 인스터럭션의 특징

  AMR7은 32 Bit 코어입니다. 특징적인 것은 모든 명령어가  32Bit  하나의
  Word로 구성된다는 것입니다. 8086의 경우엔 명령어에 따라 1바이트 명령
  부터 5바이트 까지 있나요? 그런데, ARM7은 모든 명령어를 한 워드로  처
  리 합니다. 일단은 명령어의 개수가 몇 안되고, 주소는  상대주소 방식을
  사용하며, 심지어는 Immediate 상수값도 32비트 값은 그대로 넣을 수  없
  습니다.

  무슨 얘기냐면, 만약 r0 에 32비트 상수를 넣고 싶다면, 몇몇 예외를  제
  외 하고는 메모리에 미리 넣어두고 해당 메모리를 상대 주소로  참조해서
  얻어 와야 한다는 뜻입니다.

  역시 장단점이 있겠지만, 장점으로는 모는 명령어를 같은 사이즈로  처리
  함에 따라 파이프라인 구현이 용이하다는 점이 있습니다. 그리고  명령어
  해석기를 설계할 경우 예외 처리부분이 없으므로, 쉽고 고속으로 처리할
  수 있겠지요.
  단점은 앞에서도 간단히 언급했지만 코딩시에 몇몇 제한이 따른다는 점입
  니다. 상대 주소 지정 방식은, 이때 사용하는 옵셋이 24+2=26 비트  이므
  로, 상대주소라고는 하지만 거의 불편이 없고, 다만 Immediate  오퍼랜드
  를 지정할 경우에 좀 번거롭다는 점이 있습니다. 그러나 8비트의  해상도
  를 가지는 오퍼랜드라면 한 워드 내에서 처리 가능합니다. 자세한 내용은
  다시 말씀드리겠습니다.

  ARM 인스터럭션의 다른 특징으로는 모든 명렁어를  조건적으로  실행시킬
  수 있다는 것입니다. 저의 경우엔 이부분에서 대단히 감명을  받았는데요
  예를 들어, 8086에서는 jz, jc 와 같은 점프 명령을 사용합니다. 그 의미
  는 제로 플래그가 설정되어 있으면 점프를 해라, 혹은 캐리 플래그가  설
  정되어 있으면 점프를 해라.. 라는 의미임을 아실 것입니다. 그냥 무조건
  점프의 경우엔 jmp 를 쓰지요.

  ARM의 경우엔 그런 플래그의 사용이 점프명령에 국한되지 않고, 예외  없
  이 모든 명령어에 사용할 수 있습니다.

ex)  BEQ jmp_1 ; Branch if Z flag set to jmp_1
     MOVEQ r0,r1   ; r0 := r1 if Z flag set...

  위의 경우를 보시면 jmp에 해당하는 B 명령 뿐만 아니라 MOV 와 같은  데
  이터 전송명령에도 플래그 옵션을 사용했음을 볼 수 있습니다. 이런 기능
  의 장점은 잠깐만 생각해 보아도 알 수 있습니다. 예를 들어 C 연산자 중
  에 ? 연산자를 컴파일 한다고 생각해 봅시다.
  
ex) a=(b==c) ? d:e;

(편이상 변수를 레지스터로 바꾸어 생각하겠습니다.)

    CMPS r2,r3
    MOVEQ r1,r4
    MOVNE r1,r5

  아직 명령어를 안 다루었으므로 대충 의미는 추측해 보십시요.  8086이랑
  대충은 비슷하니까 어려운 일은 아닐것입니다. r2와 r3를 비교해서,   그
  결과가 같다면 r1에 r4를 넣고, 그렇지 않다면 r1에 r5를 넣는  코드입니
  다. 만약 같은 일을 8086등에서 하려면 점프 명령이 한개 이상은  들어가
  야 하겠죠.

  다시한번 강조하지만 ARM7에서는 이와같은 조건 옵션을 모든(!) 명령어에
  사용 가능합니다.  실제로 모든 OP 코드의 상위 4비트는 이런 조건옵션을
  나타내는데 사용되는 비트입니다. 각조건에 사용되는 접미사 목록입니다.

0 EQ Z Set equal
1 NE Z Clear not equal
2 CS C Set unsigned higher or same
3 CC C Clear unsigned lower
4 MI N Set negative
5 PL M Clear positive or zero
6 VS V Set overflow
7 VC V Clear no overflow
8 HI C Set and Z Clear unsigned higher
9 LS C Clear or Z Set unsigned lower or same
10 GE N Set and V Set or greater or equal
                N Clear and V Clear
11 LT N Set and V Clear or less than
N clear and V set
12 GT Z clear and greater than
ether N set and V set or
N Clear and V clear
13 LE Z Set or less than or equal
N set and V clear or
N clear and V set
14 AL always
15 NV never

  뒷부분에 가서는 무지 복잡하죠? 저두 치면서 이걸 꼭 쳐야 할 필요가 있
  을까 생각을 했습니다만, 이왕 시작한거.. 하면서 다  쳤군요.  자세하고
  정확한 내용은 다른 문서를 참조하시길 바라고 여기서는 그냥 이런것들이
  있구나 하는 정도만 알아두십시요.

  다음으로 말씀드릴 명령어의 특징은 대부분의 명령어에 S 라는  접미사를
  사용하여 플래그 레지스터에 영향을 줄지 여부를 결정할 수 있다는  것입
  니다. 특히 연산명령을 수행할 때 'S'를 붙이면 해당 결과에 따라서 플래
  그 값들이 변하게 되고, 붙이지 않으면 영향을 미치지 않도록 할 수 있습
  니다. 8086에서는 연산의 결과에 따라 항상 플래그 값이 영향을 받죠? 여
  기서는 받지 않게 할수도 있다는 점을 말씀드렸습니다. 자세한 내용은 명
  령어의 세부사항을 참조해야 겠지요.

  명령어의 특징을 말씀드리는 중인데, 앞으로도 오퍼랜드 사용 등에  대해
  말씀드릴것이 많이 남아있네요... 그런데분량은 점점 늘어나고...

  ARM은 지금 말씀드리는 규칙들이 거의 예외없이 적용됩니다. 명령어가 간
  단한 대신 옵션이 많거든요...그리고 지금 그 옵션 두가지를  말씀드렸구
  요.

  오늘은 그냥 끝내기는 서운하니까 점프 명령 하나만 말씀드리고 마치겠습
  니다.

  * Branch and Branch with link (B, BL)

  --------------------------------------------------------------------
  | Cond | 101 | L |                                                 |
  --------------------------------------------------------------------
 
  Cond 부분은 위에서 말씀드린 조건 옵션이구요, 101은 B 명령 코드입니다

  L 부분은 1일 경우 BL 이 되는 것이고 0이면 B 명령입니다. B는 JMP 라고
  생각하시면 되고, BL은 CALL로 생각하시면됩니다. 다만 BL의 경우엔 PC값
  을 스택에 넣는것이 아니라 r14(lr)에 넣는다는 것이 차이가 있습니다.

  나머지 하위 24비트가 Offset으로 사용되는데, ARM7은  모든  명령어들이
  Word단위이므로 총 +/- 32메가 바이트 영역을 커버합니다.

  좀 어수선한 느낌입니다만.. 오늘은 이만.

2007/10/19 - [임베디드/ARM] - ARM7 강좌 [6] : Exception(2) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [5] : Exception(1) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [4] : 레지스터 (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [3] : ARM7의 구조 (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 2 개요 (출처 : 디지털 동호회)
Posted by suvisor