IT 그리고 정보보안/Knowledge base

어셈블리어 - CMP

plummmm 2021. 4. 17. 10:22
반응형

비교하는 명령이다.

CMP 명령은 첫번째 값에서 두번째 값을 뺐을 때 마이너스(-)가 되는 경우 CF=1

0일 경우 ZF=1 플레그가 설정된다.

 

플래그는 CPU의 FLAG 레지스터에 저장되는 처리 데이터 이다.

FLAG의 한 비트가 한 플래그가 됨. 그 플래그가 어떻게 설정되냐에 따라 분기문 조건이 달라진다.

 

CMP명령으로 플래그가 어떻게 설정하느냐에 따라 조건 분기 명령이 다 다르다.

표에 정리를

 

궁금증이 하나 생기게 된다. 그럼 플래그를 어디서 확인해??

Ollydbg에 레지스터 창에서 확인이 가능하다.

C P A Z S T D O 이친구들이 모두 앞서 설명한 플래그 레지스터 들이다.

 

모든 산술 연산, 논리 연산이 끝나고난 결과값에 대해 상태 플레그값을 설정한다.

C: Carry flag : 연산결과가 저장공간을 벗어날 경우 설정됨. (부호 無)

S : Sign flag : 연산결과가 1일 때 설정됨.

Z : Zero flag : 연산결과가 0일 때 설정됨.

O : Overflow flag : 연산결과가 1비트를 넘었을 때 설정됨.(부호 有)

 

기본적인 jmp 명령의 동작을 익혔으니 예제를 통해 알아보자.

 

위 프로그램을 분석해보자.

 

push ebp

mov ebp, esp

sub esp, 8h

: 이제 말안해도 알제. 함수 프롤로그.. 스택 두공간을 할당한다.

 

mov dword ptr [ebp-4], 10h : 이것도 뭐.. 스택 첫번째 자리에 0x10을 저장한다.

mov dword ptr [ebp-8], 20h : 두번째 자리에 0x20을 저장한다.

 

mov eax, dword ptr [ebp-4] : [ebp-4] 값을 주소로 갖는 곳의 내용을 eax에 저장한다. 여기서는 0x10이 되겠지.

mov ebx, dword ptr [ebp-8] : 마찬가지. 0x20 값을 ebx에 저장한다.

 

여기서 부터 조건 분기문이 시작된다. (코드 보면 Start: 되어있음.)

inc eax : eax의 값을 1 증가시킨다.

cmp eax, ebx : eax와 ebx의 값을 비교한다.

je Exit : 두 값이 같으면 Exit로 간다.

ja Exit : eax의 값이 ebx보다 더 크면 Exit로 간다.

jmp Start : 조건에 부합하여 Exit로 못가면 다시 Start로 가서 조건 분기문을 수행한다.

 

Exit:

pop ebp

retn

: 조건에 부합하여 루프를 빠져나오면 함수 에필로그.. 덜덜

반응형