5. 산술 명령어

5.1. 문서 규칙

표기법: Rd, Rm, Rn 은 ARM 레지스터 R0-R7을 나타냅니다. immN 은 N비트 폭을 가진 즉시값을 나타냅니다(예: imm8, imm3). carry 는 캐리 조건 플래그를 나타내고, not(carry) 는 그 보수를 나타냅니다. 둘 이상의 레지스터 인수를 갖는 명령어의 경우, 그중 일부가 동일해도 무방합니다. 예를 들어 다음은 R0의 내용을 자기 자신에 더하여 결과를 R0에 넣습니다:

  • add(r0, r0, r0)

산술 명령어는 명시된 경우를 제외하고 조건 플래그에 영향을 줍니다.

5.2. 덧셈

  • add(Rdn, imm8) Rdn = Rdn + imm8

  • add(Rd, Rn, imm3) Rd = Rn + imm3

  • add(Rd, Rn, Rm) Rd = Rn + Rm

  • adc(Rd, Rn) Rd = Rd + Rn + carry

5.3. 뺄셈

  • sub(Rdn, imm8) Rdn = Rdn - imm8

  • sub(Rd, Rn, imm3) Rd = Rn - imm3

  • sub(Rd, Rn, Rm) Rd = Rn - Rm

  • sbc(Rd, Rn) Rd = Rd - Rn - not(carry)

5.4. 부호 반전

  • neg(Rd, Rn) Rd = -Rn

5.5. 곱셈과 나눗셈

  • mul(Rd, Rn) Rd = Rd * Rn

이것은 오버플로가 손실된 32비트 결과를 생성합니다. 결과는 피연산자의 정의에 따라 부호 있는 값 또는 부호 없는 값으로 취급될 수 있습니다.

  • sdiv(Rd, Rn, Rm) Rd = Rn / Rm

  • udiv(Rd, Rn, Rm) Rd = Rn / Rm

이 함수들은 각각 부호 있는 나눗셈과 부호 없는 나눗셈을 수행합니다. 조건 플래그에는 영향을 주지 않습니다.