● ARM7 명령어의 특징
AMR7은 32 Bit 코어입니다. 특징적인 것은 모든 명령어가 32Bit 하나의 Word로 구성된다는 것입니다. 8086의 경우엔 명령어에 따라 1바이트 명령부터 5바이트까지 있나요? 그런데, ARM7은 모든 명령어를 한 워드로 처리합니다. 일단은 명령어의 개수가 몇 안되고, 주소는 상대주소 방식을 사용하며, 심지어는 Immediate 상수 값도 32비트 값은 그대로 넣을 수 없습니다.
무슨 이야기인가 하면, 만약 r0에 32비트 상수를 넣고 싶다면, 몇몇 예외를 제외하고는 메모리에 미리 넣어두고 해당 메모리를 상대 주소로 참조해서 얻어 와야 한다는 뜻입니다.
역시 장단점이 있겠지만, 장점으로는 모든 명령어를 같은 사이즈로 처리함에 따라 파이프라인 구현이 용이하다는 점이 있습니다. 그리고 명령어 해석기를 설계할 경우 예외 처리부분이 없으므로, 쉽고 고속으로 처리할 수 있겠지요. 단점은 앞에서도 간단히 언급했지만 코딩 시에 몇몇 제한이 따른다는 점입니다. 상대 주소 지정 방식은, 이때 사용하는 Offset이 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메가 바이트 영역을 커버합니다.
좀 어수선한 느낌입니다만. 오늘은 이만.