반응형



[어셈블리어 기초] CMP JMP CALL RET NOP  


 

 

 

① CMP

비교합니다.

 

 CMP 연산 결과

 ZF

 CF

 dest  < source

 0

 1

 dest  > source

 0

 0

 dest == source

 1

 0

CMP reg, reg

CMP mem, reg

CMP reg, mem

CMP reg, imm

CMP mem, imm

#include <stdio.h>

int main( int argc, char* argv[] )
{
 int nValue = 5;

 __asm
 {
  CMP nValue, 0x05  //dest, source 비교
 }

 printf( "%d\n", nValue );
 

return 0;
}

5와 5를 비교하면 같으므로 ZF = 1, CF = 0 이 나옵니다.

 

 

② JMP

지정된 위치로 이동합니다. C에서 goto문이랑 비슷합니다.

JMP label

JMP reg16

JMP mem16

JMP mem32

#include <stdio.h>

int main( int argc, char* argv[] )
{
 int nValue = 5;

 __asm
 {
  JMP L1
  MOV nValue, 0x0A            //생략한다.

 

 L1:
  MOV nValue, 0x01
 }

 printf( "%d\n", nValue );

return 0;
}

결과





L1으로 이동하므로 MOV nValue, 0x0A는 실행되지 않습니다.

 

 

③ 조건 점프 명령

조건이 있는 점프 명령어들이 있습니다.

 

 조건 점프 명령

 산술, 논리 연산 

 JA

 CMP dest  > source

 JB

 CMP dest  < source

 JE

 CMP dest == source

 JNE

 CMP dest  != source

 JZ

 TEST EAX, EAX (EAX = 0)

 JNZ

 TEST EAX, EAX (EAX = 1)

 

#include <stdio.h>

int main( int argc, char* argv[] )
{
 int nValue = 5;
 char *pszResult = NULL;

 __asm
 {
  CMP nValue, 0x05

  JA DestBig                //nValue가 클 때
  JB DestSmall             //nValue가 작을 때

  JE DestSame             //nValue가 같을 
 }

switch(1)
{
case 1 : DestBig: pszResult = "nValue가 더 큽니다"; break;
case 2 : DestSmall: pszResult = "nValue가 더 작습니다"; break;
case 3 : DestSame: pszResult = "nValue 와 같습니다"; break;
}

puts(pszResult);


return 0;
}

결과

 

 

 명령어

 의미

 부등호

 플래그 조건

 JA

 jump if (unsigned) above

 >

 CF = 0 and ZF = 0

 JAE

 jump if (unsigned) above or eual

 >=

 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

 jump if carry flag set

 

 CF = 1

 JCXZ

 jump if CX is 0

 

 CX = 0

 JE

 jump if equal

 ==

 ZF = 1

 JECXZ

 jump if ECX is 0

 

 ECX = 0

 JG

 jump if (signed) greater

 >

 ZF = 0 and SF == OF

 JZ

 jump if zero

 ==

 ZF = 1

 

 

④ CALL

함수를 콜합니다.

#include <stdio.h>

int Sum(void);

int main( int argc, char* argv[] )
{
 int nResult = 0;

 printf( "계산 전 : %d\n", nResult );

 __asm
 {
  CALL Sum
  MOV nResult, EAX
 }

 printf( "계산 후 : %d\n", nResult );

return 0;
}

int Sum(void)
{
 int nValue1 = 1, 
  nValue2 =2;

 printf( "sum 함수 call\n" );

return nValue1 + nValue2;
}

결과

반환 값은 EAX에 대입됩니다.

 

 

⑤ RET

ESP 레지스터가 가르키는 값을 EIP 레지스터에 저장

RET imm8

#include <stdio.h>

int Sum(void);

int main( int argc, char* argv[] )
{
 __asm
 {
  RET
 }

return 0;
}

 

 

⑥ NOP

아무 동작도 수행하지 않는 명령어입니다.

#include <stdio.h>

int main( int argc, char* argv[] )
{
 __asm
 {
  NOP
  NOP
  NOP
  NOP
 }

return 0;
}

NOP을 이용한 버퍼오버플로우때 공부했었죠.

 

 

 

출처 : I2Sec 

http://blog.naver.com/shw20319/20138513661


반응형

+ Recent posts