데이터 이동 명령어 (mov)
mov dst, src
mov 명령 | 설명 |
mov eax, ebx | EBX레지스터 내의 값을 EAX 레지스터로 복사 |
mov eax, 0x42 | 값 0x42를 EAX 레지스터로 복사 |
mov eax, [0x4037c4] | 메모리 주소 0x4037C4에 있는 4바이트 값을 EAX레지스터로 복사 |
mov eax, [ebx] | EBX 레지스터가 명시한 메모리 주소의 4바이트 값을 EAX 레지스터로 복사 |
mov eax, [ebx+esi*4] | EBX+ESI*4 연산 결과가 명시한 메모리 주소의 4바이트 값을 EAX레지스터로 복사 |
데이터 이동 명령어 (lea)
lea des, src
메모리 주소를 목적지에 넣을 때 사용한다. lea는 주소를 저장하는데 사용하고, mov는 값을 저장하는데 사용한다.
lea와 mov의 차이 | 설명 |
lea eax, [ebx+8] | EBX+8을 EAX에 저장함 |
mov eax, [ebx+8] | EBX+8 주소에 저장된 값을 EAX에 복사 |
push와 pop 명령어
스택에 데이터를 넣거나 꺼내는 명령어이다.
push는 오퍼랜드 값을 스택에 넣는다. pop은 스택에서 값을 가져와 레지스터로 저장한다. 이명령어는 스택을 사용하기 때문에 스택포인터(ESP) 값이 변경된다.
명령어 | 설명 |
pop eax | 스택에서 값을 꺼내 EAX 레지스터에 저장한다 (ESP가 4만큼 증가함) |
mov eax, [esp] | 스택에서 값을 읽어와 EAX에 저장함 (ESP가 변하지 않음) |
산술연산 명령어
산술연산을 수행하기 위한 명령어는 다음과 같다.
사칙연산, 증감연산, 음수 연산 등이 있다.
명령 | 설명 | 사용 예 |
add | 덧셈 | add ecx, 10 |
sub | 뺄셈 | sub ecx, 5 |
inc | 오퍼랜드 내용을 1증가 | inc ecx |
dec | 오퍼랜드 내용을 1감소 | dec ecx |
mul / imul | EAX와 오퍼랜드를 곱셈하여 EAX에 저장 | mul ebx |
div / idiv | EAX를 오퍼랜드로 나누어 EAX에 저장 | div ebx |
neg | 오퍼랜드의 2의 보수 (부호 반전) | neg eax |
비트연산 명령어
명령 | 설명 | 사용 예 |
and | 논리곱 (AND) | and eax, 0 |
or | 논리합 (OR) | or ebx, 0xffffffff |
xor | 배타적 논리합 (XOR) | xor ebx, 0x0000ffff |
not | 오퍼랜드의 1의 보수 (비트 반전) | not ebx |
shl | 왼쪽으로 오퍼랜드만큼 이동 (shift) (최하위 비트는 0으로 채워짐) |
shl eax, 1 |
shr | 오른쪽으로 오퍼랜드만큼 이동 (최상위 비트는 부호비트로 채워짐) |
shr eax, 2 |
rol rcl |
왼쪽으로 오퍼랜드만큼 순환 (rotate) (최하위 비트는 최상위 비트로 채워짐) |
rol eax, 1 |
ror rcr |
오른쪽으로 오퍼랜드만큼 순환 (최상위 비트는 최하위비트로 채워짐) |
ror eax, 2 |
제어 명령어
명령 | 설명 | 사용 예 |
cmp | 두 개의 오퍼랜드 비교 (뺄셈 연산을 해보고 플래고를 설정함) |
cmp ecx, 0 |
test | 두 개의 오퍼랜드를 비교 (AND 연산을 수행해보고 플래그를 설정함) |
test eax, eax |
call | 해당되는 주소의 함수를 호출하여 수행 코드 위치를 옮김 | call 0x12345678 |
int | 오퍼랜드로 지정된 예외 처리 수행(0xcd) 중단점으로 디버그용 소프트웨어 트랩(0xcc) 오버플로우 예외 상황시 발생하는 트랩 (0xce) 하드웨어 디버그 트랩 (0xf1) |
int 3 int3 into int1 |
leave | 함수에서 사용한 지역변수 스택을 비움 | leave |
ret | 스택에 저장된 주소로 복귀 | ret |
nop | 아무 동작도 수행하지 않음 (0x90) | nop |
댓글