어셈블리어란 무엇일까요? 먼저 고급 언어와 저급 언어부터 짚고 넘어가겠습니다. 고급 언어는 간단히 말해 인간이 이해하기 쉬운 언어입니다. Python, C, C++, JAVA, Javascript 등이 있습니다. 일반적으로 영어를 베이스로 합니다. 주로 if-else, while, main, include, input 등 영어 단어로 구성됩니다. 반면, 저급 언어는 하드웨어에 가까운 언어입니다. 하드웨어를 조작하며, 대표적으로 2진법을 사용하는 기계어가 있습니다. 그러나 0과 1로 프로그래밍을 하는 것은 어렵기 때문에 기계어와 영어 단어를 1대1 대응으로 치환해 만들어진 언어를 어셈블리어라고 합니다. EDSAC 개발진 중 한명인 David Wheeler가 고안했습니다. 어셈블리어는 CPU 아키텍처에 따라 문법과 구조가 다릅니다.
아키텍처란 무엇일까요? 아키텍처는 '구조'라는 뜻을 가지고 있습니다. 여기서 알아볼 구조는 명령어 집합 구조입니다. 영어로 Instruction Set Architecture의 약자인 ISA라고 합니다. 명령어 집합 구조는 크게 CISC와 RISC 구조가 있습니다. CISC는 개인용 컴퓨팅 환경에, RISC는 스마트폰이나 임베디드 기기에 유리합니다. CISC 64bit에서 유명한 AMD64(x86-64) 아키텍처의 어셈블리어의 기초 명령어와 레지스터를 보겠습니다.
X86
기초 명령어
데이터 이동(Data Transfer) | mov | 값 복사 |
lea | 주소 복사 | |
산술 연산(Arithmetic) | add | 덧셈 |
sub | 뺄셈 | |
mul | 곱셈 | |
div | 나눗셈 | |
inc | 증가 | |
dec | 감소 | |
논리 연산(Logical) | and, or, not, xor | 비트연산 |
비교(Comparison) | cmp | 비교 |
test | 두 피연산자들에 대한 비트 연산인 AND 수행 | |
분기(Branch) | jmp | jump의 약자. 원하는 레이블로 점프 |
je | jump if equal의 약자. 같으면 점프 | |
jz | jump if zero의 약자. 0이면 점프 | |
jg | jump if greater의 약자. 크면 점프 | |
jp | jump if parity의 약자. 패리티인 경우 점프 | |
ja | jump if albove의 약자. 앞의 것이 크면 점프 | |
jb | jump if below의 약자. 앞의 것이 작으면 점프 | |
스택(Stack) | push | 스택에 push |
pop | 스택에 pop | |
프로시저(Procedure) | call | 함수 호출 |
ret | 함수 리턴 | |
leave | 함수 레벨 | |
시스템 콜(System call) | syscall | 운영체제(커널)이 제공하는 서비스 |
nop | 아무것도 하지 않는 코드지만 쓰일 때가 있음 | |
loop | 루프 반복 | |
int | 인터럽트 |
범용 레지스터
아래의 표는 범용 레지스터입니다.
- 32bit: 접두어에 E를 붙힙니다.
- Ex) EBP
- 64bit: 접두어에 R을 붙힙니다.
- Ex) RBP
AX (Accumulator register) | 산술 연산에 사용(중간 결과를 저장해 놓음) |
CX (Counter register) | 시프트/회전 연산과 루프에서 사용 |
DX (Data register) | 산술 연산과 I/O 명령에서 사용 |
BX (Base register) | 데이터의 주소를 가리키는 포인터로 사용 |
SP (Stack Pointer register) | 스택의 베이스를 가리키는 포인터로 사용 |
BP (Stack Base Pointer register) | 스트림 명령에서 베이스를 가리키는 포인터로 사용 |
SI (Source Index register) | 스트림 명령에서 소스를 가리키는 포인터로 사용 |
DI (Destination Index register) | 스트링 명령에서 도착점을 가리키는 포인터로 사용 |
세그먼트 레지스터
Stack Segment (SS) | 스택 |
Code Segment (CS) | 코드 |
Data Segment (DS) | 데이터 |
Extra Segment (ES) | 추가적인 데이터 |
F Segment (FS) | 많은 추가적인 데이터 |
G Segment (GS) | 더 많은 추가적인 데이터 |
레지스터에 대한 자세한 사항은 아래 글을 참조하세요.
2023.03.18 - [Security/System] - [009] x86과 x64 아키텍처의 레지스터를 표로 알아보자!
출처
- “어셈블리어 튜토리얼 (1) 설치/기초”, blog 『{}.cook(...)』, 2017.02.09, https://note.heyo.me/blog/2017/02/asm-tutorial-1-%EC%84%A4%EC%B9%98%EA%B8%B0%EC%B4%88.
- "TEST (x86 명령어)", 위키백과, 2023.03.13 접속, https://ko.wikipedia.org/wiki/TEST_(x86_%EB%AA%85%EB%A0%B9%EC%96%B4).
- "JMP (x86 명령어)", 위키백과, 2023.03.13 접속, https://ko.wikipedia.org/wiki/JMP_(x86_%EB%AA%85%EB%A0%B9%EC%96%B4).
- “24. [어셈블리어][ASM] 어셈블리어 프로그램이 그 외 (Enter,Leave,Lea,Loop) !!!”, 네이버 blog 『TwoRivers』, 2013.08.11, https://abcdefgh123123.tistory.com/493.
- “x86 assembly system call”, 티스토리 『test_kernelv2』, 2021.12.11, https://testkernelv2.tistory.com/m/227.
- "System Hacking", Dreamhack(드림핵), 2023.03.13 접속, https://dreamhack.io/lecture/roadmaps/2.
- "x86 어셈블리/x86 아키텍처", 위키책, 2023.03.13 접속, https://ko.wikibooks.org/wiki/X86_%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC/x86_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98.
- "Intel x86 JUMP quick reference", Steve Friedl's Unixwiz.net Tech Tips, 2023.03.14 접속, http://unixwiz.net/techtips/x86-jumps.html.
- "cmp 에 의한 점프 명령어와 플래그 jmp, je==jz, ja, jb, jna, jnb, jbe , 비트 플래그", 3DMP, 2017.02.21, https://3dmpengines.tistory.com/1671.
태그
#AMD64 #x86 #레지스터 #명령어 #세그먼트 #어셈블리어