기본 어셈블리 ASSEMBLY
기계어 - 2 진수를 가지고 기계가 이해할 수 있도록 표현한 언어
기계어와 어셈블리어는 1:1 매칭으로 이루어져 있음
#OPCODE, operand
operand는 0 ~ 3개까지 올 수 있음.
ex) MOV EAX, 10
MOV같은 어셈블리를 OPCODE
EAX, 10같은 값들을 operand라고 볼 수 있음.
# 데이터 복사 (이동) - MOV
- MOV dst, src (src 값을 dst에 대입)
ex) MOV EAX, 1245678 // EAX에 12345678 복사
MOV ECX, EAX // ECX에 EAX 값 복사
MOV dword ptr[00406000], EAX // 00406000주소를 찾아 간 후 4 Byte
공간에 EAX 복사
잘못된 사용 ex)
MOV AX, EDX // OVER FLOW !! 2 bytes 공간에 4 bytes 값 대입 불가!!
MOV ECX, AL // AL = 1bytes ECX = 4bytes
<1byte> 11111111 -> 부호가 없으면(unsigned) 255 있으면(signed) -1
# 데이터 확장 복사 (MOVSX, MOVZX)
- MOV와 사용법은 동일
@ MOVSX : signed 부호 있음
@ MOVZX : unsigned 부호 없음
# 산술 연산 ( + - * / % )
inc oper // ++
inc eax // eax++
dex oper // --
dex eax // eax --
add dst, src // 더하기
add eax, 3 // eax에 3을 더함, eax= eax + 3
sub dst, src // 뺄셈
sub eax, 3 // eax 에 3을 뺌. eax = eax - 3
mul oper // 곱셈mul
mul cl // ah:al = al * cl 기본적으로 al과 곱함
mul cx // dx:ax = ax * cx
mul ecx // edx:eax = eax * ecx
mul oper1, oper2
mul bx, cx // bx * cx
mul ebx, ecx // ebx * ecx
mul eax, exc, 0x10 // eax = ecx * 0x10
div oper(/.%) 몫, 나머지
div cl // al / cl = 몫 : al, 나머지 : ah
div cx // ax / ex = 몫 : ax, 나머지 : dx
div ecx // eax / ecx = 몫 : eax, 나머지 : edx
cbw
cwd
cdq
EBP-4는 변수 a의 주소, EBP-8은 변수 b의 주소, EBP-C 변수 c의 주소
MOV DWORD PTR[EBP-4], 5 > int a=5;
MOV BYTE PTR[EBP-8], 61 > char b = 'a';
MOV EAX, DWORD PTR[EBP-4] >
MOVSX ECX, BYTE PTR[EBP-8] >
ADD EAX, ECX >
MOV DWORD PTR[EBP-C], EAX > int c = a+b;
MOV DWORD PTR SS:[EBP-4], 32 > int a = 50;
MOV DWORD PTR SS:[EBP-8], 14 > int b = 20;
MOV EAX, DWORD PTR SS:[EBP-4] > eax = 50;
CDQ >
IDIV DWORD PTR SS:[EBP-8] >
MOV DWORD PTR SS:[EBP-C],EAX > int c = a/b;
MOV EAX, DWORD PTR SS:[EBP-4]>
CDQ >
IDIV DWORD PTR SS:[EBP-8] >
MOV DWORD PTR SS:[EBP-10],EDX > int d = a%b;