비교하는 명령이다.
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
: 조건에 부합하여 루프를 빠져나오면 함수 에필로그.. 덜덜
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
어셈블리 - REP 명령어 (0) | 2021.04.17 |
---|---|
어셈블리어 - CALL / JMP / RET (0) | 2021.04.17 |
어셈블리어 - MOV와 LEA 차이점 (0) | 2021.04.17 |
어셈블리어 - LEA 명령어 (0) | 2021.04.17 |
어셈블리어 - MOVZX 명령어 (0) | 2021.04.17 |