top of page

기본 어셈블리 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;

 RECENT POSTS: 
 SEARCH BY TAGS: 
  • Facebook B&W
bottom of page