본문 바로가기

Assembly

자주 사용되는 Assembly어 정리

728x90

본 포스트는 자주 사용되는 x86 아키텍처 assembly를 몇가지 정리한다.

 


Data Management

move eax, ecx
mov eax, 1

레지스터 ECX에 있는 데이터를 레지스터 EAX로 옮겨라.

레지스터 EAX에 1을 저장해라.

 

move eax, dword ptr ds:[0x12345678]

주소 0x12345678에 있는 데이터를 레지스터 EAX에 저장해라.

 

lea eax, dword ptr ds:[ecx]

ECX 레지스터가 가르키는 주소에 있는 값을 EAX 레지스터에 저장해라.


Changing Data

inc eax
dec eax

레지스터 EAX에 있는 값을 1만큼 증가/감소시켜라.

 

add eax, 2
add eax, ebx  
sub eax, 4

레지스터 EAX에 있는 값을 2만큼 증가시켜라.

레지스터 EAX와 EBX에 있는 값을 더해 EAX에 저장해라.

레지스터 EAX에 있는 값을 4만큼 감소시켜라.

 

mul 4
div 4

레지스터 EAX에 있는 값에 4를 곱하거나 나눠라.

Assembly에 eax가 명시되어 있지않음을 유의하자.

 

shl eax, 2
shr eax, 2
and eax, ebx 
or eax, ebx 
xor eax, ebx
  • 레지스터 EAX에 있는 값을 왼쪽 방향으로 2비트만큼 bit shift해라.
  • 레지스터 EAX에 있는 값을 오른쪽 방향으로 2비트만큼 bit shift해라.
  • 레지스터 EAX와 EBX에 있는 값을 bitwise AND시켜 레지스터 EAX에 저장해라.
  • 레지스터 EAX와 EBX에 있는 값을 bitwise OR시켜 레지스터 EAX에 저장해라.
  • 레지스터 EAX와 EBX에 있는 값을 bitwise XOR시켜 레지스터 EAX에 저장해라.
shl eax, 2
shr eax, 2
and eax, ebx 
or eax, ebx 
xor eax, ebx

Flow Control

jmp 0x12345678

PC(Program Counter)를 주소 0x12345678로 설정해라.

 

call 0x12345678

실행되는 instruction의 주소를 임시적으로 0x12345678로 설정.

 

cmp eax, 2

레지스터 EAX에 있는 값이 2인지 확인.

 

test eax, eax

레지스터 EAX에 있는 값끼리 bitwise AND시킨다.

만약 결과값이 0이면 ZF(Zero Flag)를 1로 설정한다.

레지스터 EAX에 있는 값이 0인지 확인할 때 주로 사용된다.

 

cmp eax, ebx
jz 0x12345678

레지스터 EAX와 EBX에 있는 값이 일치하면 0x12345678로 jump.

jz는 jump if zero를 뜻한다.

이 외에도 다음이 있다:

jnz : jump if not zero

je : jump if equal

jne : jump if not equal


Stack

 

push 5
pop eax

Stack에 5를 넣는다.

Stack에서 나온 값을 레지스터 EAX에 저장한다.

 

push 5
push eax
call 0x12345678

함수 호출(call) 전에 context를 저장하기 위해 push가 사용된다.

 

// prologue
push ebp
mov ebp, esp
sub esp, ... 

// 함수 본문
...

// epilogue
leave 
ret

함수는 각자의 stack frame이 있다.

첫 세 줄은 function prologue로써 함수를 위한 stack frame을 세팅한다.

마지막 두 줄은 원래의 함수로 돌아올 때 원래 함수의 stack frame을 복원한다.