ADD

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.10.09
조회수
14
버전
v1

ADD

ADD 어셈블리 언어에서 가장 기본적이고 핵심적인 산술 명령어 중 하나로, 두 개의 피연산자를 더하여 그 결과를 목적지 피연산자에 저장 역할을 한다 이 명령어는 대부분의 프로세서 아키텍처(CISC,ISC 등)에서 지원되며, CPU의 산 논리 장치U)를 통해 수행된다. ADD 명령어는 수치 계산, 메모리 주소 계산, 루프 제어 등 다양한 저수준 프로그래밍 상황에서 광범위하게 사용된다.

개요

ADD 명령어는 두 개의 값을 더하는 연산을 수행하며, 결과를 지정된 레지스터나 메모리 위치에 저장한다. 일반적으로 이 명령어는 플래그 레지스터(flag register)의 상태에도 영향을 미치며, 특히 캐리 플래그(Carry Flag), 제로 플래그(Zero Flag), 오버플로우 플래그(Overflow Flag) 등을 설정하여 후속 조건 분기(branching) 또는 오류 처리에 활용된다.

ADD는 대부분의 어셈블리 언어에서 다음과 같은 형식으로 표현된다:

ADD destination, source

여기서 destination은 연산 결과가 저장될 위치이며, source는 더해지는 값이다. 연산 후 destination = destination + source가 된다.


주요 특징

1. 피연산자 유형

ADD 명령어는 다양한 피연산자 조합을 지원하며, 일반적으로 다음 형태를 가진다:

  • 레지스터 간 연산:

      ADD EAX, EBX      ; EAX ← EAX + EBX
      

  • 레지스터와 즉시값(immediate value) 연산:

      ADD ECX, 5        ; ECX ← ECX + 5
      

  • 레지스터와 메모리 간 연산:

      ADD EDX, [var]    ; EDX ← EDX + 메모리 주소 var의 값
      

  • 메모리와 레지스터 간 연산:

      ADD [var], EAX    ; 메모리 주소 var의 값 ← [var] + EAX
      

2. 플래그 영향

ADD 명령어는 CPU 상태 플래그에 다음과 같은 영향을 준다:

플래그 설명
Zero Flag (ZF) 결과가 0이면 1로 설정됨
Carry Flag (CF) 부호 없는 산술에서 오버플로우 발생 시 설정 (예: 8비트에서 255 + 1)
Overflow Flag (OF) 부호 있는 산술에서 오버플로우 발생 시 설정 (예: 127 + 1 → -128)
Sign Flag (SF) 결과의 부호 비트(MSB)가 1이면 설정 (음수)
Parity Flag (PF) 결과의 하위 바이트에서 1의 개수가 짝수면 설정

이 플래그들은 JZ(제로 점프), JC(캐리 점프), JO(오버플로우 점프) 등의 조건 분기 명령어와 함께 사용되어 프로그램 흐름을 제어하는 데 중요하다.


아키텍처별 구현 예시

x86/x64 아키텍처

x86 계열 프로세서에서 ADD 명령어는 매우 유연하게 사용된다. 예를 들어:

ADD AL, BL          ; 8비트 레지스터 AL과 BL을 더함
ADD AX, 10          ; 16비트 레지스터 AX에 10을 더함
ADD EAX, ECX        ; 32비트 레지스터 EAX에 ECX 값을 더함
ADD RAX, 100        ; 64비트 레지스터 RAX에 100을 더함 (x64 전용)

x86에서는 메모리 접근도 가능하므로, 복잡한 데이터 구조 연산에도 활용된다.

ARM 아키텍처

ARM에서는 ADD 명령어가 다음과 같은 형식으로 사용된다:

ADD R0, R1, R2      ; R0 ← R1 + R2
ADD R3, R3, #5      ; R3 ← R3 + 5 (즉시값)

ARM은 일반적으로 세-주소 형식(three-operand)을 사용하므로, 소스 두 개와 목적지를 명시할 수 있어 더 직관적이다. 조건부 실행도 가능하며, 예를 들어 ADDEQ는 조건이 같을 때만 실행된다.


활용 사례

1. 루프 카운터 증가

MOV ECX, 0          ; 루프 카운터 초기화
loop_start:
    ADD ECX, 1      ; 카운터 증가
    CMP ECX, 10     ; 10과 비교
    JL loop_start   ; 작으면 반복

2. 배열 인덱스 계산

MOV EAX, 4          ; 각 요소가 4바이트(int)라고 가정
MUL EBX             ; EBX: 인덱스, EAX ← EAX * EBX
ADD EAX, array_base ; 배열 시작 주소에 오프셋 추가

3. 부호 없는 오버플로우 처리

ADD EAX, EBX
JC overflow_handler ; 캐리 플래그가 켜졌으면 오버플로우 처리


관련 명령어

명령어 설명
ADC (Add with Carry) 캐리 플래그를 포함하여 더하기 (멀티워드 덧셈에 사용)
INC 1 증가 (플래그 영향이 ADD보다 제한적)
SUB 뺄셈
XADD (x86) 교환 후 덧셈 (원자적 연산에 사용)

참고 자료

  • Intel® 64 and IA-32 Architectures Software Developer’s Manual
  • ARM Architecture Reference Manual
  • "Computer Organization and Design" by David A. Patterson and John L. Hennessy

관련 문서

ADD 명령어는 저수준 시스템 프로그래밍의 기초이자 핵심으로, 성능 최적화, 임베디드 시스템, 운영체제 개발 등 다양한 분야에서 필수적인 역할을 한다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?