opcode] [destination operand], [source operand]
[명령어] [대상 오퍼랜드], [소스 오퍼랜드]
* PUSH: SP 레지스터를 조작하는 명령어 중의 하나로 스택에 데이터를 저장한다.
push
push eax ; eax 레지스터의 값을 스택에 집어 넣는다.
push 20 ; 20을 스택에 집어 넣는다.
push 40203F ; 메모리 주소 40203F의 값을 스택에 집어 넣는다.
* POP: 역시 SP 레지스터를 조작하는 명령어로 스택의 데이터를 꺼낸다.
pop
pop eax ; 맨 마지막에 스택에 집어넣은 값을 꺼내 eax 레지스터에 저장.
* MOV: 메모리나 레지스터 등의 값을 옮길 때 쓰인다.
move
mov eax,ebx ; ebx의 값을 eax로 옮긴다.
mov eax,20 ; 20을 eax에 옮긴다.
mov eax,dword ptr [40203F] ;메모리 주소 40203F의 값을 eax에 옮긴다.
* LEA: 대상 오퍼랜드의 값을 소스 오퍼랜드의 값으로 만든다.
load effective address
lea eax,ebx ; eax의 값을 ebx의 값으로 만든다.
* INC: 레지스터의 값을 1 증가 시킨다.
increase
inc eax ; eax의 값을 1 증가 시킨다.
* DEC: 레지스터의 값을 1 감소 시킨다.
decrease
dec eax ; eax의 값을 1 감소 시킨다.
* ADD: 레지스터의 값이나 메모리의 값을 더할 때 쓰인다.
add
add eax,ebx ; eax = eax + ebx
add eax,20 ; eax = eax + 20
add eax,dword ptr [40203F] ; eax = eax + 40203F의 값
* SUB: 레지스터의 값이나 메모리의 값을 뺄 때 쓰인다.
subtract
sub eax,ebx ; eax = eax - ebx
sub eax,20 ; eax = eax - 20
sub eax,dword ptr [40203F] ; eax = eax - 40203F의 값
* NOP: 아무 것도 하지 않는다.
no operation
* CALL: 프로시져(procedure)를 호출할 때 쓰인다.
call
call dword ptr [40203F] ; 메모리 주소 40203F을 호출한다.
* RET, RETN: 호출한 지점으로 돌아간다.
return
* CMP: 레지스터 끼리 혹은 레지스터와 값을 비교한다.
compare
cmp eax,ebx ; eax와 ebx를 비교한다.
cmp eax,20 ; eax와 20을 비교한다.
cmp eax,dword ptr [40203F] ; eax와 메모리 40203F의 값을 비교한다.
* JMP: 특정 위치로 무조건 점프한다.
unconditional jump
jmp dword ptr [40203F] ; 메모리 40203F 위치에 적힌 4바이트 값(dword) 이 지정한 위치로 점프.
조건부 점프: CMP나 TEST와 같은 연산 결과에 따라 점프를 결정
* JE: CMP나 TEST 의 결과가 같다면 점프
jump if equal
* JNE: CMP나 TEST 의 결과가 같지 않다면 점프
jump if not equal
* JZ: 왼쪽 인자의 값이 0 이라면 점프
jump if zero
* JNZ: 왼쪽 인자의 값이 0 이 아니라면 점프
jump if not zero
* JL: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프
jump if less; signed
* JNL: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면 (크거나 같으면) 점프
jump if not less; signed
* JB: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프
jump if below; unsigned
* JNB: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면 (크거나 같으면) 점프
jump if not below; unsigned
* JG: 왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프
jump if greater
* JNG: 왼쪽 인자의 값이 오른쪽 인자의 값보다 크지 않으면 (작거나 같으면) 점프
jump if not greater
* JLE: 왼쪽 인자의 값이 오른쪽 인자의 값보다 작거나 같으면 점프
jump if less or equal; signed
* JGE: 왼쪽 인자의 값이 오른쪽 인자의 값보다 크거나 같으면 점프
jump if greater or equal
논리 연산
논리 연산에도 여러가지가 있지만, 자주 쓰이는 and, or, not, xor, text만
다루도록 하겠다.
* AND: 대응되는 각 비트가 모두 1이면 1, 나머지는 모두 0
다음 표를 알아두라.
A B &
-----
0 0 0
0 1 0
1 0 0
1 1 1
mov eax,10
and eax,8
eax의 값은,
1010 & 1000 = 1000
8이다.
* OR: 대응되는 각 비트 중 하나라도 1이면 1, 모두 0이면 0
A B |
-----
0 0 0
0 1 1
1 0 1
1 1 1
* XOR: 대응되는 각 비트가 서로 다르면 1, 서로 같으면 0
A B ^
-----
0 0 0
0 1 1
1 0 1
1 1 0
* NOT: 각 비트를 반전시킨다.
A !
---
0 1
1 0
mov eax,8
not eax
eax의 값은,
1000을 반전시킨 0111이므로 7이다.
'dekar' 카테고리의 다른 글
[스크랩] [어셈블리어] 어셈블리어 강좌 3 (0) | 2009.02.20 |
---|---|
[스크랩] [어셈블리어] 어셈블리어 강좌 2 (0) | 2009.02.20 |
[스크랩] [어셈블리어] 어셈블리어 강좌 1 (0) | 2009.02.20 |
[스크랩] [어셈블리어] 어셈블리 초급 기초 #2 (0) | 2009.02.20 |
[스크랩] [어셈블리어] 어셈블리 초급 기초 #1 (0) | 2009.02.20 |