본문 바로가기
프로그래밍/SYSTEM HACKING

[SYSTEM HACKING] 어셈블리 분기문( compare<cmp>, jump<jmp> )

by B T Y 2017. 10. 23.
반응형

어셈블리 분기문( compare<cmp>, jump<jmp> )에 대해서 정리한다.




분기문: if, switch


1. cmp: compare


  - 레지스터나 메모리의 값을 변경하지 않는다.


  - 플래그 레지스터에만 영향을 준다.

  - SF,CF, ZF


  - cmp left, right




( 문서를 통해서 참조한 EFLAGS Register의 형태이다... )



! 두 피연산자의 비교


  left - right

   ( SUB 명령어와 같이 빼기 연산을 하고 그 결과에 따라서 플래그에 영향을 미치게 된다.. )



1). 결과가 0인 경우: 같은 경우


  - ZF: 1, SF:0


2). 결과가 음수인 경우:  right가 더 큰 경우


  - ZF: 0, SF: 1


3). 결과가 양수인 경우: left가 더 큰 경우


  - ZF:0, SF: 0




( cmp 명령을 이용해서 두 피연산자를 비교해도 해당 메모리나 플래그에는 영향을 미치지 않고

플래그 레지스터에만 영향을 주게 된다... )






( ZF 플래그는 0일 경우 켜지는 플래그이고 SF 같은 경우에는 부호가 있는 경우 켜지는 플래그이다.. )





2. 분기문


1). 무조건 분기문: jump


  - jmp <address & offset>








2). 조건 분기문


  - 플래그 레지스터를 보고 분기를 결정한다.



ex).

if ( 10 < 20) {

  printf("less\n");

}


    * 문서를 참조해보면 어셈블리 opcode로 표현될때는 예를 들어서 작거나같지않다와 크다의 op 코드는 서로 같게 표현이 된다.

        ( C언어 코드를 어셈블리로 변환해서 분석할때 이러한 표현에 주의해서 해석해야 한다 )










[실습]


    * 어셈블리에는 논리연산자가 존재하지 않는다.



if (eax == 0 && ebx >= 1 && ecx < 2)

  edx = 1

else

  edx = 0


extern printf


section .data

prompt_int db '%d', 10, 00


section .text

global main


main:

cmp eax, 0

jne else


cmp ebx, 1

jl else


cmp ecx, 2

jge else


if:

mov edx, 1

jmp end

else:

mov edx, 0

end:



if (eax == 0 || ebx >= 1 || ecx < 2)

  edx = 1

else

  edx = 0


extern printf


section .data

prompt_int db '%d', 10, 00


section .text

global main

main:

cmp eax, 0

je if


cmp ebx, 1

jge if


cmp ecx, 2

jnl else


if:

mov edx, 1

jmp end

else:

mov edx, 0

end:



if ((eax == 0 && ebx >= 1) || ecx < 2)

  edx = 1

else

  edx = 0


extern printf


section .data

prompt_int db '%d', 10, 00


section .text

global main

main:

cmp eax, 0

jne jmp2


cmp ebx, 1

jge if


jmp2:

cmp ecx, 2

jnl else


if:

mov edx, 1

jmp end

else:

mov edx, 0

end:




반응형

댓글