mov add sub cmp jmp
mov
mov는 두 번째 피연산자의 값을 첫 번째 피연산자로 복사하는 명령어다.
mov eax,ebx= "ebx의 값을 eax로 복사한다."
add
add는 첫 번째 피연산자에 두번째 피연산자의 값을 더한 결과를 저장하는 명령어다.
add eax, ebx= "eax에 ebx를 더한 값을 eax에 저장한다." (+=)
- 플래그 변화 (연산 결과에 따라 플래그 값이 변경된다. 추후 플래그에 대해서 더 알아보도록 하겠다.)
ZF(Zero Flag): 결과가 0이면 1
CF(Carry Flag): overflow 발생 시 1
SF(Sign Flag): 결과가 음수이면 1
sub
sub는 첫 번째 피연산자에서 두 번째 피연산자의 값을 뺀 결과를 저장하는 명령어다.
sub eax, ebx= “eax에서 ebx를 뺀 값을 eax에 저장한다.” (-=)
- 플래그 변화
ZF: 결과가 0이면 1
CF: Borrow 발생 시 1
SF: 결과가 음수이면 1
cmp
cmp는 두 피연산자의 값을 비교하는 명령어다.
내부적으로는sub와 동일하게 뺄셈을 수행하지만, 결과를 저장하지 않고 플래그만 변경한다.
cmp eax, ebx= "eax와 ebx를 비교한다." (eax-ebx 수행 후 결과 버림)
- 플래그 변화
ZF: 두 값이 같으면 1 (eax == ebx)
CF: Borrow 발생 시 1 (eax < ebx)
SF: 결과가 음수면 1 (eax < ebx)
jmp
jmp는 프로그램의 실행 흐름을 다른 위치로 이동 시키는 명령어다.
-> 다음에 실행할 명령어의 주소(label)를 바꿔서 코드의 흐름을 제어
jmp label= "label 위치로 이동하여 그곳부터 실행을 계속한다."
jmp기본 구조section .text global _start ; ----------------- _start: jmp skip_part ; --(실행되지 않음)-- mov eax, 1 mov ebx, 2 ; ----------------- skip_part: mov eax, 10 mov ebx, 20
레지스터는 CPU 내부에 위치한 임시저장공간이다.
레지스터는 다양한 종류가 있지만 여기서는 범용 레지스터와 플래그 레지스터만 다루겠다.
x86(32비트)에는 EAX, EBX, ECX, EDX, EDI, ESI, ESP, EBP 총 8가지 범용 레지스터가 있다.
산술 연산, 반복문, 스택 관리, 메모리 접근 등 거의 모든 연산의 중심이 된다.
| 레지스터 | 이름(의미) | 주요 역할 |
|---|---|---|
| EAX | Accumulator | 연산 결과나 함수 리턴값 저장 |
| EBX | Base | 메모리 주소 계산에 사용 |
| ECX | Counter | 루프나 반복문 제어에 사용 |
| EDX | Data | 곱셈·나눗셈 시 보조 역할 |
| ESI | Source Index | 문자열/배열 복사 시 입력 위치 |
| EDI | Destination Index | 문자열/배열 복사 시 출력 위치 |
| EBP | Base Pointer | 스택 프레임 기준 주소 (함수 내부 변수 참조) |
| ESP | Stack Pointer | 스택의 최상단(Top)을 가리킴 |
💡 참고: 64비트(x86-64) 환경에서는
EAX → RAX,EBX → RBX처럼
R접두사가 붙으며,R8 ~ R15까지 추가 레지스터가 존재한다.
플래그 레지스터는 CPU가 연산을 수행한 후
그 결과의 상태를 기록하는 상태 저장 레지스터이다.
조건문(cmp, je, jne, jg, jl 등)은 이 플래그 값을 참조하여 분기 여부를 결정한다.
| 플래그 | 의미 | 역할 |
|---|---|---|
| ZF (Zero Flag) | 0 플래그 | 연산 결과가 0이면 1로 설정 |
| SF (Sign Flag) | 부호 플래그 | 결과가 음수이면 1로 설정 |
| CF (Carry Flag) | 캐리 플래그 | 자리올림(또는 자리내림) 발생 시 1 |
| OF (Overflow Flag) | 오버플로 플래그 | 부호 있는 연산에서 오버플로 발생 시 1 |
| PF (Parity Flag) | 패리티 플래그 | 결과의 1 비트 개수가 짝수면 1 |
💡 예시:
cmp eax, ebx ; EAX와 EBX 비교 → EFLAGS 설정 je equal_label ; ZF=1이면(equal) 점프 수행