본문 바로가기
  • fishing...
  • eating...
MISCELLANEOUSNESS

어셈 블리어..

by 회색뿔 2007. 12. 11.


1.어셈블리어
Push  : sp
레지스터를 조작하는 명령어중의 하나이다.
스택에 데이터를 저장하는데 쓰인다
.
ex:) Push eax :
스택에 Eax의 값을 스택에 저장한다
.
ex:) Push 20 :
즉석값인 20을 스택에 저장한다
.
ex:) Push 401F47 :
메모리 오프셋 401F47의 값을 스택에 저장한다
.

Pop  :
이또한 sp 레지스터를 조작하는 명령어중 하나이다.
스택에서 데이터를 꺼내는데 쓰인다.
ex:) Pop eax :스택에 가장 상위에 있는 값을 꺼내애서 eax에 저장한다.
주의점 : Push 의 역순으로 값은 스택에서 Pop 된다
.

Mov
 : 메모리나 레지스터의 값을 옮길 때[로 만들 때]쓰인다.
ex:) Mov eax,ebx    :ebx
레지스터의 값을 eax로 옮긴다[로 만든다
].
ex:) Mov eax,20     :
즉석값인 20 eax레지스터 에 옮긴다[로 만든다
].
ex:) Mov eax,dword ptr[401F47]   :
메모리 오프셋 401F47 의 값을 eax에 옮긴다[로 만든다
]

Lea  : 오퍼렌드1의 값을 오퍼렌드2의 값으로 만들어준다.
ex:) Lea eax,ebx    : eax
레지스터의 값을 ebx의 값으로 만든다
.

Inc  :
레지스터의 값을 1증가 시킨다
.
ex:) Inc eax  : Eax
레지스터의 값을 1증가 시킨다
.

Dec  : 레지스터의 값을 1 감소 시킨다.
ex:) Dec eax : Eax
레지스터의 값을 1 감소 시킨다
.

Add  : 레지스터나 메모리의 값을 덧셈할떄 쓰임.
ex:) Add eax,ebx   :Eax
레지스터의 값에 ebx 값을 더한다
.
ex:) Add eax,50    :Eax
레지스터에 즉석값인 50을 더한다
.
ex:) Add eax,dword ptr[401F47]  : Eax
레지스터에 메모리 오프셋 401F47의 값을 더한다
.

Sub  
:
레지스터나 메모리의 값을 뻇셈할떄 쓰임
.
ex:) Sub eax,ebx   : Eax
레지스터에서 ebx 레지스터의 값을 뺸다
.
ex:) Sub eax,50

Eax  
:
레지스터에서 즉석값 50을 뺸다
.
ex:) Sub eax,dword ptr[401F47]    :Eax
레지스터에서 메모리 오프셋 401F47의 값을 뺸다
.

Nop
 :
아무동작도 하지 않는다
. : 90

Call
:
프로시저를 호출할떄 쓰인다
.
ex:) Call dword ptr[401F47]    :
메모리 오프셋 401F47을 콜한다
.

Ret
:
콜한 지점으로 돌아간다
.

Cmp
:
레지스터와 레지스터혹은 레지스터 값을 비교하기위하여 쓰인다
.
ex:) Cmp eax,ebx    :Eax
레지스터와 Ebx 레지스터의 값을 비교한다
.
ex:) Cmp eax,50     :Eax
레지스터와 즉석값 50을 비교한다
.
ex:) Cmp eax,dword ptr[401F47]
:Eax
레지스터와 메모리 오프셋 401F47의 값을 비교한다
.

Jmp : 특정한 메모리 오프셋으로 이동할떄 쓰인다.
ex:) Jmp dword ptr[401F47]   :
메모리 오프셋 401F47 로 점프한다
.
조건부 점프: Cmp Test 같은 명령어의 결과에 따라점프한다
.
Je  : Cmp
Test 의 결과가 같다면 점프
 
Jne : Cmp
Text 의 결과가 같지 않다면 점프

Jz  :
왼쪽 인자의 값이 0 이라면 점프
Jnz  :
왼쪽 인자의 값이 0 이 아니라면 점프
Jl   :
왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프(부호있는
)
Jnl  :
왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호있는
)
Jb   :
왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프(부호없는
)
Jnb  :
왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호없는
)
Jg   :
왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프

Jng  :
왼쪽 인자의 값이 오른쪽 인자의 값보다 크지 않으면 (작거나 같으면) 점프
Jle   :
왼쪽 인자의 값이 오른쪽 인자의 값보다 작거나 같으면점프 (부호있는)
Jge  :
왼쪽 인자의 값이 오른쪽 인자의 값보다 크거나 같으면 점프


2. 논리연산
이글에서는 5가지 논리연산에 대해서 쓸것이다.
논리연산자는 두 오퍼렌드의 값의 비트들을 대응시켜 명령에 따른 적절한 값을 구하여 첫번쨰 오퍼렌드의 값을 바꾸어 주는것이다
.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AND 연산

대응되는 비트가 둘다 1이면 결과는 1이고 그외의 결과들은 모두 0 이 된다.
ex:) MOV EAX,8
AND EAX,10 :
위를 계산하기 위해 우선 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8 1000 이 되고 10 1010 이 되고 AND 연산은 둘다 1이여야 1이 됨으로 결과는 1000 이 됩니다
.

OR 연산

대응되는 비트중 하나가 1 또는 둘다 1이면 결과는 1이고 그외는 모두 0이 된다.
ex:) MOV EAX,8
OR EAX,10
:
위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8 1000이 되고 10 1010이 되고 OR 연산은 한쪽 또는 양쪽둘다 1이면 1이고그외는 모두 0 임으로 결과는 1010이 된다
.

XOR 연산

대응되는 비트 중에서 한비트가 1이고 다른 비트가 0이면 1이 되고 두개의 비트가 1이면 0 이 되고 두개다 0 이어도 0이 된다.
ex:) MOV EAX,8
XOR EAX,10
:
위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8 1000이 되고 10 1010이 되고 XOR 연산은 한쪽만 1이어야 1임으로 결과는 10이 된다
.

NOT 연산

NOT
연산은 오퍼렌드의 값을 반대로 하여 준다.
ex:) MOV EAX,10
NOT EAX
:
위를 계산하기 위해 오퍼렌드의 값을 2진수로 바꾸어 주면 10 1010이 되고 NOT 연산은 1 0을 반대로 하여 줌으로 결과는 0101 이 된다
.
*Test
연산은 오퍼렌드에 영향을 주지 않으며 플래그만 세트 시키어 준다
.

.레지스터

범용 레지스터
(1) Eax 레지스터

누산기인 Eax 레지스터는
입출력과 거의 모든 산술연산에 사용된다. 곱셋과 나눗셈, 변환 명령어등은 반드시 Eax 레지스터를 필요하게 된다.
Eax 레지스터는 32bit의 레지스터이고 16bit 의 레지스터로 ax가 있다.
(ax
는 왼쪽의 ah와 오른쪽의 al로 이루어져 있다)

(2)  Ebx 레지스터

Ebx
는 주소지정을 확대하기 위한 인덱스로서 사용될수 있는 유일한 범용 레지스터 이며, 다른 일반적인 계산 용도로도 쓰인다.
Ebx
32bit 레지스터이고 16bit eb가 있다
.
(eb
는 왼쪽의 bh와 오른쪽의 bl로 이루어져 있다
)
(3) Ecx 레지스터

Ecx
는 루프의 반복 횟수나 좌우방향의 시프트 비트 수를 기억한다. 그외의 계산에도 사용된다.
Ecx
32bit 레지스터이고 16bit cx가 있다
.
(cx
는 왼쪽의 ch와 오른쪽의 cl로 이루어져 있다
.)
(4) Edx 레지스터

Edx
는 몇몇 입출력 동작에서 사용 된다
.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

플래그 레지스터

(1) OF [Over Flow]
산술연산후 상위 비트의 오버플로를 나타냄
(2) DF [Direction]
스트링 데이터를 이동하거나 비교할떄 왼쪽 또는 오른쪽으로의 방향을 결정한다.
(4) SF [Sign]
산술결과의 부호를 나타낸다.[0=양수,1=음수
]
(5) ZF [zero]
산술연산 또는 비교동작의 결과를 나타낸다
.
[0=
결과가 0이 아님,1=결과가 0
]
(6) CF [Carry]
산술연산후 상위 비트로부터의 캐리 그리고 시프트 또는 회전동작의 결과 마지막 비트

내용을 저장한다
.
(7) TF [trap]
프로세서가 단일 스텝 모드(single-step mode)를 동작할수 있도록 해준다.


출처 : Tong - 통토로동통똥똥님의 reverse tech통


어셈을 공부합시다.ㅋㅋ

'MISCELLANEOUSNESS' 카테고리의 다른 글

MySQL데이터 타입  (4) 2007.12.12
[JDBC] JAVA + MySQL 연동 테스트  (0) 2007.12.08
[JAVA/JDBC] JDBC 설치  (0) 2007.12.07