서론
어셈블러(Assembler) : 어셈블리어->기계어
역어셈블러(Disassembler) : 기계어->어셈블리 언어
명령어 집합구조(ISA) 종류가 많은 만큼 어셈블리어 존재
기본 구조
명령어(Operation Code, Opcode)+피연산자(Operand)로 구성
mov 3ax, 3
// opcode operand1 operand2
// 대입해라 eax에 3을
| 명령 코드 | |
|---|---|
| 데이터 이동(Data Trasfer) | mov, lea |
| 산술 연산(Arithmetic) | inc, dec, add, sub |
| 논리 연산(Logical) | and, or, xor, not |
| 비교(Comparison) | cmp, test |
| 분기(Branch) | jmp, je, jg |
| 스택(Stack) | push, pop |
| 프로시져(Procedure) | call, ret, leave |
| 시스템 콜(System call) | syscall |
어떤 값을 레지스터나 메모리에 옮기도록 지시
1. mov dst, src : src에 들어있는 값을 dst에 대입
| __ | |
|---|---|
| mov rdi, rsi | rsi의 값을 rdi에 대입 |
| mov QWORD PTR[rdi], rsi | rsi의 값을 rdi가 가리키는 주소에 대입 |
| mov QWORD PTR[rdi+8*rcx] | rsi의 값을 rdi=8*rcs가 가리키는 주소에 대입 |
2. lea dst, src : src의 유효 주소(Effective Address, EA)를 dst에 저장합니다
| _ | |
|---|---|
| lea rsi, [rbx+8*rcx] | rbx+8*rcx를 rsi에 대입 |
사칙 연산 지시
1. add dst, src : dst에 src의 값을 더함
| -- | |
|---|---|
| add eax, 3 | eax += 3 |
| add ax, WORD PTR[rdi] | ax +=(WORD)rdi |
2. sub dst, src : dst에서 src의 값을 뺌
| -- | |
|---|---|
| sub eax, 3 | eax -= 3 |
| sub ax, WORD PTR[rdi] | ax -=(WORD)rdi |
3. inc op : op의 값을 1 증가시킴
| -- | |
|---|---|
| inc eax | eax += 1 |
4. dec op : op의 값을 1 감소시킴
| -- | |
|---|---|
| dec eax | eax -= 1 |
비트 연산 지시, 이 연산은 비트 단위로 이뤄짐




두 피연산자의 값을 비교하고, 플래그 설정


rip을 이동시켜 실행 흐름을 바꿈


