기계어 : 컴퓨터의 언어
어셈블러 : 어셈블리어로 작성된 코드를 기계어로 치환
역어셈블러 : 기계어를 어셈블리어로 번역
어셈블리 언어 : 컴퓨터의 기계어와 치환되는 언어
명령어, 피연산자로 구성
mov eax, 3 → 3을 eax에 대입
명령어
역할 명령어 데이터 이동(Data Transfer) 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 피연산자 : 상수, 레지스터, 메모리
메모리 피연산자 : []으로 둘러싸인 형태
BYTE(1바이트), WORD(2바이트), DWORD(4바이트), QWORD(8바이트)
메모리 피연산자 역할 QWORD PTR [0x8048000] 0x8048000의 데이터를 8바이트만큼 참조 DWORD PTR [0X8048000] 0x8048000의 데이터를 4바이트만큼 참조 WORD PTR [rax] rax가 가리키는 주소에서 데이터를 2바이트만큼 참조
어떤 값을 레지스터나 메모리에 옮기도록 지시
mov dst, src : src의 값을 dst에 대입
lea dst, src : src의 유효 주소를 dst에 대입
명령 역할 mov rdi, rsi rsi의 값을 rdi에 대입 mov QWORD PTR[rdi], rsi rsi의 값을 rdi가 가리키는 주소에 대입 mov QWORD PTR[rdi+8*rcx], rsi rsi의 값을 rdi+8*rcx가 가리키는 주소에 대입 lea rsi, [rbx+8*rcx] rbx+8*rcx를 rsi에 대입
사칙연산을 지시
명령 역할 add eax, 3 eax+=3 add ax, WORD PTR[rdi] ax에 rdi가 가리키는 값을 더함 sub eax, 3 eax-=3 sub ax, WORD PTR[rdi] ax를 rdi가 가리키는 값만큼 뺌 inc eax eax+=1 dec eax eax-=1
and, or, xor, neg 등의 비트 연산을 지시, 비트 단위로 이루어짐
명령 역할 and dst, src dst와 src 각각의 비트가 모두 1이면 1, 아니면 0 or dst, src dst와 src 각각의 비트가 하나라도 1이면 1, 아니면 0 xor dst, src dst와 src 각각의 비트가 하나만 1이면 1, 아니면 0 not op op의 비트 전부 반전
두 피연산자의 값을 비교하고, 플래그 설정
cmp : 두 피연산자를 빼서 대소비교
test : 두 피연산자에 AND 비트연산을 취함
명령 역할 cmp op1, op2 op1과 op2를 비교(op1-op2) test op1, op2 op1과 op2를 비교(op1&op2)
실행 흐름을 변경
명령 역할 jmp addr addr로 rip을 이동 je addr 직전에 비교한 두 피연산자가 같으면 addr로 rip을 이동 jg addr 직전에 비교한 두 연산자 중 전자가 더 크면 addr로 rip을 이동