티스토리 뷰
[어셈블리어] CMP 명령어 종류
CMP operand 를 비교 (묵시적 마이너스 연산) 첫번째 operand 에서 두번째 operand 값을 뺀다. 결과 = 상태레지스터 operand에 영향 없음. |
CMP reg, reg ex) CMP EAX, EBX |
CMP mem, reg ex) CMP [EBP-0x04], EAX |
|
CMP reg, mem ex) CMP EAX, [EBP-0x04] |
|
CMP reg, imm ex) CMP EAX , 0x02 |
|
CMP mem, imm ex) [EBP-0x04], 0x05 |
CMP 연산 결과 |
ZF(Zero Flag) |
CF (Carry Flag) |
dest < source a < b |
0 |
1 |
dest > source a > b |
0 |
0 |
dest == source a == b |
1 |
0 |
a가 b 보다 작다.
[ ZF: 0 ] [ CF :1 ] CF가 SET 될 경우, 결과값이 음수이거나,
결과가 너무 커서 해당 크기에 담을 수 없을 때 SET.
a가 b 보다 크다.
[ ZF: 0 ] [ CF :0 ]
a가 b 와 같다.
[ ZF: 1 ] [ CF :0 ] a-b= 0 이기 때문에 결과값이 0이면 ZF가 SET 된다.
점프 명령
JMP 만나면 무조건 operand 위치로 점프 (코드상 label 위치로) |
JMP label ex) JMP L3 |
JMP reg16 ex) JMP AX |
|
JMP mem16 ex) JMP [0xFFFF] |
|
JMP mem32 ex) JMP [0x12345678] |
int a = 0 ; _asm { JMP L1 // L1 위치로 점프. MOV a, 0x0A // 실행하지 않고 넘어간다. L1: MOV a, 0x01 } printf("%d\n",a); } 결과값 : 1 |
조건 점프 명령 (CMP 를 참조)
조건 점프 명령 |
산술, 논리 연산 |
|
JA |
CMP A > B |
CMP |
JB |
CMP A < B |
|
JE |
CMP A == B |
|
JNE |
CMP A != B |
|
JZ |
TEST EAX, EAX (EAX = 0) |
TEST |
JNZ |
TEST EAX, EAX (EAX = 1) |
명령어 |
의미 |
부등호 |
플래그 조건 |
JA |
Jump if (unsigned) above |
> |
CF = 0 and ZF = 0 |
JAE |
Jump if (unsigned) above or equal |
>= |
CF = 0 OR ZF = 1 |
JB |
Jump if (unsigned) below |
< |
CF = 1 |
JBE |
Jump if (unsigned) below or equal |
<= |
CF = 1 OR ZF = 1 |
JC |
Jmup if carry flag set |
|
CF = 1 |
JCXZ |
Jump if CX is 0 ( CX = 0 ) |
|
CX = 0 |
JE |
Jump if equal |
== |
ZF = 1 |
JECXZ |
Jmup if ECX is 0 ( ECX = 0 ) |
ECX =0 |
|
JG |
Jmup if(signed) greater <=> JL |
> |
ZF=0, and SF==OF |
JZ |
Jump if zero |
== |
ZF = 1 |
CMP 결과는 상태레지스터에 영향을 주기 때문에
CMP 결과 다음 조건 점프 명령어를 사용한다.
JE = CMP 에 적합.
JZ = TEST 에 적합.
ex)
MOV EAX , 0x02
CMP EAX , 0x01
JA L1
'Programming > Programming' 카테고리의 다른 글
[Tool] 리버싱툴 Ollydbg110 설정 (0) | 2015.08.07 |
---|---|
[어셈블리어] CALL 명령어 (0) | 2015.07.23 |
[어셈블리어] 명령어.(Opcode) (0) | 2015.07.18 |
[어셈블리어] 명령어와 Operand (0) | 2015.07.15 |
[리버싱] 레지스터 기초 (0) | 2015.07.15 |