본 포스트는 자주 사용되는 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을 복원한다.