dekar

레지 & 어셈 정보

전설비 2008. 9. 21. 10:37

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이다.