어셈블리어(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:
; 다음 코드 계속 진행
정리하자면
쭉 정리하고 예제까지 보고 나니 이전에는 안 보이던 것들이 보이는 신기한 경험을 하게 된다. 어렵게만 느껴지고 낯설었던 또 하나의 세계를 알아간다. 그렇게 하나씩 해가면 언젠가는 원하는 바에 가까워지지 않을까?
'프로그래밍' 카테고리의 다른 글
| 메모리 모델(Memory Model)이란? (0) | 2026.02.24 |
|---|---|
| 실행 중인 프로세스(Process)를 디버깅하기 (0) | 2026.01.24 |
| 비쥬얼 스튜디오 기능 톺아보기 - 필터 모드와 폴더 모드 (0) | 2025.11.30 |
| CP949와 UTF-8의 차이에 대해서 알아보자 (0) | 2025.04.21 |
| HTTP Header에는 한글이 포함될 수 없다! Header로 데이터 보내기 (0) | 2025.04.12 |
댓글