4.3.1. 유연한 두 번째 피연산자

대부분의 ARM 및 Thumb-2 일반 데이터 처리 명령어에는 유연한 두 번째 피연산자가 있습니다. 이 피연산자는 각 명령어의 구문에 대한 설명에 Operand2 로 표시됩니다. ARM 명령어와 Thumb-2 명령어의 Operand2 에 대해 허용되는 옵션에는 몇 가지 차이점이 있습니다.

구문

Operand2에는 다음 두 가지 형식을 사용할 수 있습니다.

#constant
Rm{, shift}

인수 설명:

constant

숫자 상수로 평가되는 식입니다. ARM과 Thumb-2에서 사용할 수 있는 상수의 범위는 동일하지 않습니다. 자세한 내용은 Operand2의 상수를 참조하십시오.

Rm

두 번째 피연산자에 대한 데이터가 들어 있는 ARM 레지스터입니다. 레지스터 내의 비트 패턴은 다양한 방법으로 시프트하거나 회전할 수 있습니다.

shift

Rm에 적용할 선택적 시프트. 다음 중 하나일 수 있습니다.

ASR #n

n비트만큼 오른쪽으로 산술 시프트. 1 ≤ n ≤ 32

LSL #n

n비트만큼 왼쪽으로 논리 시프트. 0 ≤ n ≤ 31

LSR #n

n비트만큼 오른쪽으로 논리 시프트. 1 ≤ n ≤ 32

ROR #n

n비트만큼 오른쪽으로 회전. 1 ≤ n ≤ 31

RRX

확장 포함 1비트만큼 오른쪽으로 회전합니다.

type Rs

ARM에서만 사용할 수 있습니다. 다음은 각 요소에 대한 설명입니다.

type

ASR, LSL, LSR, ROR 중 하나입니다.

Rs

시프트 양을 제공하는 ARM 레지스터입니다. 최하위 바이트만 사용됩니다.

Note

시프트 연산의 결과는 명령어의 Operand2로 사용되지만 Rm 자체는 변경되지 않습니다.

Operand2의 상수

ARM 명령어에서는 32비트 워드 내에서 임의의 짝수 비트 수만큼 8비트 값을 오른쪽으로 회전하여 얻을 수 있는 모든 값을 constant에 지정할 수 있습니다.

32비트 Thumb-2 명령어에서 constant는 다음 중 하나일 수 있습니다.

  • 32비트 워드 내에서 임의의 비트 수만큼 8비트 값을 왼쪽으로 시프트하여 얻을 수 있는 모든 상수

  • 0x00XY00XY 형식의 모든 상수

  • 0xXY00XY00 형식의 모든 상수

  • 0xXYXYXYXY 형식의 모든 상수

이 외에도 일부 명령어에서는 constant에 더 넓은 범위의 값을 지정할 수 있습니다. 이러한 상수에 대한 자세한 내용은 각 명령어에 대한 설명을 참조하십시오.

2, 4 또는 6비트만큼 8비트 값을 회전하여 얻은 상수는 ARM 데이터 처리 명령어에서만 사용할 수 있고 Thumb-2에서는 사용할 수 없습니다. 다른 모든 ARM 상수는 Thumb-2에서도 사용할 수 있습니다.

ASR

n비트만큼 오른쪽으로 산술 시프트는 내용이 2의 보수 부호 있는 정수로 간주될 경우 Rm에 들어 있는 값을 2n으로 나눕니다. 원래 비트[31]은 레지스터의 n비트 왼쪽에 복사됩니다.

LSR 및 LSL

n비트만큼 오른쪽으로 논리 시프트는 내용이 부호 없는 정수로 간주될 경우 Rm에 들어 있는 값을 2n으로 나눕니다. 레지스터의 왼쪽 n비트는 0으로 설정됩니다.

n비트만큼 왼쪽으로 논리 시프트는 내용이 부호 없는 정수로 간주될 경우 Rm에 들어 있는 값을 2n으로 곱합니다. 이 경우 경고 없이 오버플로가 발생할 수 있습니다. 레지스터의 오른쪽 n비트는 0으로 설정됩니다.

ROR

n비트만큼 오른쪽으로 회전은 레지스터의 오른쪽 n비트를 결과의 왼쪽 n비트로 이동합니다. 이때 다른 모든 비트도 n비트만큼 오른쪽으로 이동합니다 (Figure 4.1 참조).

Figure 4.1. ROR


RRX

확장 포함 오른쪽으로 회전은 Rm의 내용을 1비트만큼 오른쪽으로 회전합니다. carry 플래그는 Rm의 비트[31]로 복사됩니다 (Figure 4.2 참조).

S 접미사가 지정된 경우 Rm의 이전 비트[0] 값이 carry 플래그로 시프트됩니다 (carry 플래그 참조).

Figure 4.2. RRX


carry 플래그

명령어가 다음 중 하나일 경우 carry 플래그는 Rm에서 시프트된 마지막 비트로 업데이트됩니다.

  • S 접미사를 사용하는 경우, MOV, MVN, AND, ORR, ORN, EOR 또는 BIC

  • S 접미사가 필요 없는 경우, TEQ 또는 TST

명령어 대체

일부 명령어 쌍 (ADDSUB, ADCSBC, ANDBIC, MOVMVN, CMPCMN) 은 constant의 부정이나 논리 반전을 제외하고 서로 동일합니다.

constant 값을 사용할 수 없지만 해당 논리 반전이나 부정을 사용할 수 있는 경우 어셈블러는 둘 중 한 명령어를 대체하고 constant를 반전시키거나 부정합니다.

디스어셈블리 목록을 소스 코드와 비교할 때는 이러한 사항에 주의해야 합니다.

--diag_warning 1645 어셈블러 명령 행 옵션을 사용하여 명령어 대체가 발생하는 시기를 확인할 수 있습니다.

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential