티스토리 뷰

[어셈블리어] 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










Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday