1. 어셈블리어란 무엇인가
- 어셈블리어(assembly language)는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어
- 프로그래밍 언어의 하나로 기계어의 한 단계 위의 언어이며, 기계어와 단 둘 뿐인 저급 언어
- 기계어는 실제로 컴퓨터의 CPU가 읽어서 실행할 수 있는 0과 1로 이루어진 명령어의 조합 / 이러한 명령어에 대해 사람이 알아보기 쉬운 니모닉 기호를 정해 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것이 어셈블리어 언어
- 기계어는 컴퓨터의 관점에서만 바로 읽을 수 있으며, 이를 인간이 볼 수 있도록 보완한 언어가 어셈블리어
- 기계어는 CPU가 채택한 ISA에 따라 다르기 때문에, 어셈블리어의 명령어 역시 통일된 규격이 없음
- 문법 아키텍처에 따라서도 다르며, 어셈블러 종류에 따라서도 문법과 매크로가 달라짐
- 이 문서에서는 x86/x64 어셈블리어를 다룰 예정
2. 어셈블리어 특징
- 컴퓨터 구조에 따라 사용하는 기계어가 달라, 이에 대응하는 어셈블리어도 각각 다르게 적용
- 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각
- 레지스터의 크기와 개수, 저장된 데이터 형의 표현도 전부 다름
- 어셈블리어 장점
- 가독성이 좋아짐
- 프로그래머가 주석을 달 수 있어 프로그래밍이 수월해짐
- 바이너리 파일 크기가 작고 프로그램 작동 속도가 빠름
- 컴파일러에 비해 만들기 쉬움
- 기계어에 대응되는 어셈블리어 명령어 이외에도 메모리 위치나 정렬 등을 할 수 있는 지시어 사용 가능
- 매크로 기능을 이용하여 매크로 호출 가능
- 명령어 수가 적음
- 어셈블리어 단점
- 고급 언어에 비해 생산성이 떨어짐
- 언어를 이해하는 시간을 짧지만 완벽하게 익히기에 걸리는 시간이 천차만별
3. 어셈블리어 명령어
1) ADD / SUB
ADD eax 100 => eax = eax + 100
SUB eax 100 => eax = eax - 100
2) MOV
- MOV ( 데이터를 복사하는 명령어 )
- 같은 사이즈의 데이터끼리만 복사
- 메모리서 메모리로 복사 불가능
MOV ebp 20 => ebp == 20
3) PUSH
PUSH 0x10 => 스택에 0x10 저장 후 ESP 4감소
4) POP
- 스택에 데이터를 꺼내와 지정한 레지스터에 삽입하는 명령어
POP 0x10 => esp 0x10 저장 후 ESP 4증가
5) XOR, AND, OR
- 비트 논리 연산자
- AND의 경우 두 비트가 모두 1일 경우
- OR의 경우 두 비트 중 하나가 1일 경우
- XOR의 경우 두 비트 모두 0일 경우
1로 연산
6) CMP
- 비교 연산 명령어
- 두 값을 빼서 비교하며 jmp/mov와 같이 사용
7) JMP
- 다른 주소로 이동하는 명령어
- JMP는 조건없이 이동하지만
- 조건을 만족할 때 이동하는 명령어도 존재
- JE : ZF = 1 (두 값이 같을 경우)
- JZ : ZF = 1 (0의 값을 가질 경우)
- 등 여러 조건에 따라 분기하는 명령어 존재
8) CALL, RET
- CALL : 함수 호출 명령어로 현재 주소를 EIP에 저장 후 함수 호출 주소로 이동
- RET : 호출한 함수 바로 다음 지점으로 이동 ( POP EIP )