4.3.2. ADD, SUB, RSB, ADC, SBC 및 RSC

각각 carry를 포함하거나 포함하지 않은 더하기, 빼기 및 역방향 빼기

병렬 더하기 및 빼기도 참조하십시오.

구문

op{S}{cond} {Rd}, Rn, Operand2
op{cond} {Rd}, Rn, #imm12               ; Thumb-2 ADD and SUB only

인수 설명:

op

다음 중 하나입니다.

ADD

더하기

ADC

carry 포함 더하기

SUB

빼기

RSB

역방향 빼기

SBC

carry 포함 빼기

RSC

carry 포함 역방향 빼기 (ARM에만 해당)

S

선택적 접미사입니다. S를 지정하면 연산 결과의 조건 코드 플래그가 업데이트됩니다 (조건부 실행 참조).

cond

선택적 조건 코드입니다 (조건부 실행 참조).

Rd

대상 레지스터입니다.

Rn

첫 번째 피연산자가 들어 있는 레지스터입니다.

Operand2

유연한 두 번째 피연산자입니다. 옵션에 대한 자세한 내용은 유연한 두 번째 피연산자를 참조하십시오.

imm12

0 ~ 4095 범위에 있는 값입니다.

사용법

ADD 명령어는 Rn의 값과 Operand2의 값을 더합니다.

SUB 명령어는 Rn의 값에서 Operand2의 값을 뺍니다.

RSB (역방향 빼기) 명령어는 Operand2의 값에서 Rn의 값을 뺍니다. 이 명령어는 Operand2의 다양한 옵션 때문에 유용합니다.

ADC, SBCRSC를 사용하여 복수 워드 산술을 통합할 수 있습니다 (복수 워드 산술 예제 참조).

ADC (carry 포함 더하기) 명령어는 carry 플래그와 함께 Rn의 값과 Operand2의 값을 더합니다.

SBC (carry 포함 빼기) 명령어는 Rn의 값에서 Operand2의 값을 뺍니다. carry 플래그가 지워지면 결과는 1씩 감소합니다.

RSC (carry 포함 역방향 빼기) 명령어는 Operand2의 값에서 Rn의 값을 뺍니다. carry 플래그가 지워지면 결과는 1씩 감소합니다.

경우에 따라 어셈블러가 한 명령어를 다른 명령어로 대체할 수 있습니다. 디스어셈블리 목록을 읽을 때는 이러한 사항에 주의해야 합니다. 자세한 내용은 명령어 대체를 참조하십시오.

Thumb-2 명령어에서 pc 사용

이러한 명령어에서는 대부분의 경우 Rd 또는 피연산자에 pc (r15) 를 사용할 수 없습니다.

예외적으로 0 ~ 4095 범위에 있는 상수 Operand2 값을 사용하고 S 접미사가 없는 ADDSUB 명령어에서는 Rn에 pc를 사용할 수 있습니다. 이러한 명령어는 pc 상대 주소를 생성하는 데 유용합니다. 이 경우 pc 값의 비트[1]이 0으로 읽히므로 계산할 기본 주소는 항상 워드로 정렬됩니다.

SUBS pc, lr도 참조하십시오.

ADR도 참조하십시오.

ARM 명령어에서 pc 사용

pc (r15) 를 Rn으로 사용하면 명령어 주소에 8을 더한 값이 사용됩니다.

pc를 Rd로 사용할 경우 다음 사항이 적용됩니다.

  • 실행이 결과에 해당하는 주소로 분기됩니다.

  • S 접미사를 사용하면 현재 모드의 SPSR이 CPSR로 복사됩니다. 이 접미사를 사용하여 예외에서 복귀할 수 있습니다 (개발자 설명서6장 프로세서 예외 처리 참조).

ADR도 참조하십시오.

Caution

사용자 모드 또는 시스템 모드에서 pc를 Rd로 사용할 경우 S 접미사를 사용하면 안 됩니다. 이러한 명령어를 실행하면 예상할 수 없는 결과가 발생하지만 어셈블러에서 어셈블리 타임에 경고를 표시할 수 없습니다.

레지스터에 의해 제어된 시프트가 있는 데이터 처리 명령어에서는 Rd 또는 피연산자에 pc를 사용할 수 없습니다 (유연한 두 번째 피연산자 참조).

조건 플래그

S를 지정하면 이러한 명령어가 결과에 따라 N, Z, C 및 V 플래그를 업데이트합니다.

16비트 명령어

이러한 명령어의 다음 형식은 Thumb-2 이전 Thumb 코드에서 사용할 수 있으며, Thumb-2 코드에서 사용될 경우 16비트 명령어입니다.

ADDS Rd, Rn, #imm

imm 범위 0 ~ 7. RdRn은 모두 Lo 레지스터여야 합니다.

ADDS Rd, Rn, Rm

Rd, RnRm은 모두 Lo 레지스터여야 합니다.

ADD Rd, Rd, Rm

ARMv6 이하의 경우 Rd 또는 Rm이나 둘 다가 Hi 레지스터여야 합니다. ARMv6T2 이상의 경우 이 제한이 적용되지 않습니다.

ADDS Rd, Rd, #imm

imm 범위 0 ~ 255. Rd는 Lo 레지스터여야 합니다.

ADCS Rd, Rd, Rm

Rd, RnRm은 모두 Lo 레지스터여야 합니다.

ADD SP, SP, #imm

imm 범위 0 ~ 508 (워드로 정렬됨)

ADD Rd, SP, #imm

imm 범위 0 ~ 1020 (워드로 정렬됨) Rd가 Lo 레지스터여야 합니다.

ADD Rd, pc, #imm

imm 범위 0 ~ 1020 (워드로 정렬됨) Rd가 Lo 레지스터여야 합니다. 이 명령어에서 pc의 비트[1:0]은 0으로 읽습니다.

SUBS Rd, Rn, Rm

Rd, RnRm은 모두 Lo 레지스터여야 합니다.

SUBS Rd, Rn, #imm

imm 범위 0 ~ 7. RdRn은 모두 Lo 레지스터여야 합니다.

SUBS Rd, Rd, #imm

imm 범위 0 ~ 255. Rd는 Lo 레지스터여야 합니다.

SBCS Rd, Rd, Rm

Rd, RnRm은 모두 Lo 레지스터여야 합니다.

SUB SP, SP, #imm

imm 범위 0 ~ 508 (워드로 정렬됨)

RSBS Rd, Rn, #0

RdRn은 모두 Lo 레지스터여야 합니다.

예제

    ADD     r2, r1, r3
    SUBS    r8, r6, #240        ; sets the flags on the result
    RSB     r4, r4, #1280       ; subtracts contents of r4 from 1280
    ADCHI   r11, r0, r3         ; only executed if C flag set and Z
                                ; flag clear
    RSCSLE  r0,r5,r0,LSL r4     ; conditional, flags set

올바르지 않은 예제

    RSCSLE  r0,pc,r0,LSL r4    ; pc not permitted with register
                                ; controlled shift

복수 워드 산술 예제

이러한 두 명령어는 r2r3에 들어 있는 64비트 정수를 r0r1에 포함된 다른 64비트 정수에 더하고 결과를 r4r5에 배치합니다.

    ADDS    r4, r0, r2    ; adding the least significant words
    ADC     r5, r1, r3    ; adding the most significant words

이러한 명령어는 다른 정수에서 96비트 정수를 뺍니다.

    SUBS    r3, r6, r9
    SBCS    r4, r7, r10
    SBC     r5, r8, r11

다시 말하면 위 예제에서는 복수 워드 값에 연속 레지스터를 사용합니다. 이 작업을 수행할 필요는 없습니다. 예를 들어 다음 예제는 완전히 유효합니다.

    SUBS    r6, r6, r9
    SBCS    r9, r2, r1
    SBC     r2, r8, r11
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential