본문 바로가기
프로그래밍

처음 만나는 어셈블리어

by bantomak 2026. 7. 21.
반응형

어셈블리어(assembly language), 너 참 낯설다

프로그래밍하다 이슈가 생겨서 디버깅을 하다 보면 가끔 어셈블리어를 만나게 되는 순간이 온다. 그럴 때 드는 생각은 '낯설다'이다. 당연히 그럴수 밖에 없다. 대부분 C++이나 JAVA 같은 고수준 프로그래밍 언어를 다루다 보니, 중앙처리장치(CPU)와 직접 1:1로 대응되는 저수준(low-level) 프로그래밍 언어를 마주칠 일이 없기 때문이다.

 

모르면 막연히 낯설고 어렵지만, 막상 알고보면 나아지지 않을까? 조금씩이라도 친해져 보려고 정리해 본다.

데이터 이동 명령어(Data Movement)

MOV (Move)

  • 데이터를 한 곳에서 다른 곳으로 복사한다. (이름은 Move이지만 실제 역할은 Copy에 가깝다.)
  • MOV [dest] [src]
  • 예시
    • MOV EAX, 10 > EAX 레지스터에 숫자 10을 저장
    • MOV EBX, EAX  > EAX에 있는 값을 EBX로 복사

LEA (Load Effective Address)

  • 값 자체를 복사하는 대신, 메모리의 '주소' 계산 결과를 레지스터에 가져온다.
  • LEA [dest] [src]
  • *src는 항상 []로 감싼다. (MOV와의 차이점)
  • MOV랑 비교하기
    • MOV EAX, [EBX] > EBX 레지스터에 들어있는 값을 EAX에 복사
    • LEA EAX, [EBX] > EBX 레지스터에 들어있는 주소값 자체를 EAX에 복사

산술 및 논리 연산 명령어(Arithmetic & Logic)

ADD (Addition)

  • 두 값을 더한다.
  • ADD EAX, 5

SUB (Subtract)

  • 값을 뺀다.
  • SUB EAX, 3

INC / DEC (Increment / Decrement)

  • 값을 1 증가 / 감소시킨다.
  • INC EAX (EAX++)
  • DEC EAX (EAX--)

CMP (Compare)

  • 두 값을 빼서 비교한다. (결과는 따로 보관하지 않고 플래그 레지스터만 변경)
  • CMP EAX, EBX

AND / OR / XOR (Logical Operators)

  • 비트 단위 논리 연산
  • XOR EAX, EAX (자기 자신을 XOR 하면 0으로 초기화됨)

분기 및 흐름 제어 명령어 (Control Flow)

JMP (Unconditional Jump)

  • 조건 없이 지정한 주소나 라벨로 바로 이동한다. (C언어의 goto문)
  • JMP target_label

CMP (Conditional Jump)

  • JE / JZ (Jump if Eqaul / Zero): 두 값이 같으면 (차가 0이면) 이동
  • JNE / JNZ (Jump if Not Equal / Zero): 두 값이 다르면 (차가 0이 아니면) 이동
  • JG / JL (Jump if Greater / Less) : 앞의 값이 더 크면 / 작으면 이동

스택 및 함수 호출 명령어 (Stack & Function)

PUSH : 데이터를 스택 맨 위에 넣는다. (스택 포인터 ESP 감소)

POP : 스택 맨 위에 있는 데이터를 꺼내어 레지스터에 저장 (ESP 증가)

CALL :  함수를 호출한다. 돌아올 주소(Return Address)를 스택에 저장하고 함수 위치로 이동

RET (Return) : 호출했던 함수에서 돌아온다. (스택에 저장해 둔 복귀 주소로 이동)

어셈블리어 예제

int a = 5;
if (a == 5) {
    a = a + 1;
}


MOV EAX, 5          ; EAX 레지스터에 5를 넣음 (int a = 5)
CMP EAX, 5          ; EAX와 5를 비교
JNE skip            ; 같지 않으면 'skip' 라벨로 점프 (if 조건문)

ADD EAX, 1          ; 같으므로 1을 더함 (a = a + 1)

skip:
                    ; 다음 코드 계속 진행

정리하자면

쭉 정리하고 예제까지 보고 나니 이전에는 안 보이던 것들이 보이는 신기한 경험을 하게 된다. 어렵게만 느껴지고 낯설었던 또 하나의 세계를 알아간다. 그렇게 하나씩 해가면 언젠가는 원하는 바에 가까워지지 않을까?

댓글