이번 절에서는 ARM 명령어중 데이터 처리 명령어를 알아보겠습니다.
 일단 ARM 데이터 처리 명령어에는 크게 1. 레지스터 오퍼랜드 명령어와 2.시프트(shift)된 레지스터 operand가 있습니다.
 또 레즈스터 오퍼랜드 명령어에는 
  • 산술 명령어
  • 비트논리연산 명령어
  • 레지스터이동 명령어
  • 비교명령어

가 있습니다.
 
 일단 산술명령어는 2진 덧셈, 뺄셈을 뜻합니다. 이때 오퍼랜드는 32bit를 사용하고 부호를 사용하지 않을수도 있고 부호를 사용한다면 2의 보수체계를 사용합니다.
 ADD : 덧셈, ADC : carry와 함께 덧셈
 SUB : 뺄셈 SBC : 케리와 함께 뺄샘
 RSB : 역순으로 뺄셈 RSC : 역순으로 케리와 함께 뺄셈

 비트논리 연산명령어는 두개의 오퍼랜드의 비트를 연산하는 명령어입니다. 예를 들어 11 곱하기 23을 일반적으로 하면 230+23이 되어 253입니다. 하지만 비트연산을 하면 11을 2진수로 표현하면
 01101(2), 23은 10111(2) 입니다. 이 둘을 AND 비트연산을 하면 00101(2)이 되어 5가 됩니다.

레지스터 이동 명령어는 두번재 오퍼랜드첫번재 오퍼랜드로 이동시키는 명령어 입니다. 예를 들어 
 MOV R0,R2 ; r0 := r2 
가 됩니다. 
 하지만 이 과정을 조금 더 정확히 보자고 한다면 이것은 연산명령어, 즉 ALU를 거쳐가야 하므로 사실은 R2에 0을 더하는 연산명령어 입니다.다시 말하면 MOV R0,R2 는 ADD R0,R2,#0 을 바꿔서 쓴 것이라고 생각해도 무방합니다.

 비교명령어는 연산을 하지만 결과값을 레지스터에 저장하는 것이 아니라 CPSR의 Condition flag만이 update된다.

 여기서 ARM CPU만의 특징이 하나 더 나오는데 그것은 바로 Default flag update가 안된다는 점이다. 보통 cpu들은 이런 연산을 할 경우 명령어에 특별한 명령을 더 하지 않아도 flag가 update된다 하지만 ARM CPU에서는 ADD를 하더라도 ADDEQ 와 같은 뒤에 명령어를 더 붙여줘야만 flag가 업데이트 된다.
 
 
이번에는 시프트된 오퍼랜드에 대해 살펴 보겠다.

이 ARM 명령어 세트 형식을 보면 두번재 소스의 코드 길이가 12bit나 된다. 왜 이렇게 많은 bit를 할당해놨을까? 그 이유는 ALU의 shifter에 있다.
 ARM의 ALU의 두번째 source operand쪽 회로에는 Shifter가 달려있다. 즉, 모든 2nd source가 ALU연산을 할 때 shifter를 거친다는 말이다. 이런 이유로 RSB같은 명령어가 존재한다.(뒤에 있는 오퍼랜드를 shift 연산하여 뺄 경우)
 사용 예는 이렇다.
 ADD r0,r1,r2,LSL #3 ; r0 = r1 + (r2 * 3)
이 shift는 한 사이클에 모두 해결되며 31bit까지 할 수 있다. 물론 이 shift의 방법에도 여러가지가 있다.
 

  • LSL : 왼쪽으로 쉬프트 후 LSB(1의 자리)의 빈자리를 0으로 채움
  • LSR : 오른쪽으로 쉬프트 후 MSB(부호비트)의 빈자리를 0으로 채움
  • ASL : LSL과 같음
  • ASR : 오른쪽으로 쉬프트 한 후 MSB(부호비트)의 빈자리가 양수인 경우에는 0 음수인 경우에는 1로 채운다.
  • ROR : 오른쪽으로 쉬프트 한 후 LSB에서 밖으로 나온 비트는 다시 MSB로 들어간다
  • RRX  : MSB가 비워지면 CCR의 C flag가 입력된다. 나머지는 ROR과 같음


또한 알아두어야 할 것은 Condition Code의 설정이다. 일반적으로 TST 또는 CMP와 같은 비교명령들을 제외한 일반 산술 및 논리 연산은 ARM CPU의 특성에 따라 Condition flag를 update시키지 못한다. 따라서 condition flag를 update시키려면 명령어 끝에 'S'를 붙여 주어야만한다.

'ARM(Advanced RISC Machine)' 카테고리의 다른 글

2.2 - ARM 데이터 이동 명령어 -1  (0) 2009.10.23
2 - ARM과 Assembly  (0) 2009.10.23
1.4 - ARM의 Instructions  (0) 2009.10.23
1.3 - ARM의 Register  (0) 2009.10.23
1.2 - ARM과 Bekeley RISC  (0) 2009.10.23

+ Recent posts