Information Security

관계 연산(cmp) + 제어문 본문

System Hacking

관계 연산(cmp) + 제어문

leeeeye321 2018. 1. 19. 14:08

관계 연산: cmp(compare)

cmp는 플래그 레지스터의 값을 변경하기 위한 명령어이다.

 

cmp vleft, vright

sub vleft, vright 연산을 수행한 결과 값에 따라 플래그 레지스터를 변경한다. 

 

1) vleft가 더 크면 sub vleft, vright의 결과는 양의 정수가 나온다.

-> SF(Sign Flag)의 값은 0, ZF(Zero Flag)의 값은 0으로 변경된다.

 

2) vright가 더 크면 음의 정수가 나온다. (부호 발생)

-> SF의 값은 1, ZF의 값은 0으로 변경된다.

 

3) vleft와 vright가 같으면 0이 나온다.

-> SF의 값은 0, ZF의 값은 1로 변경된다.

 

pushfd로 EFLAGS 레지스터를 확인할 수 있다.

 

cmp 20, 30

sub 20, 30

-> 음의 정수(-10)가 나온다.

SF의 값은 1로, ZF의 값은 0으로 변경되었을 것이다.

 

 

EFLAGS 레지스터의 구조를 보면, 6번째 비트가 ZF이고, 7번째 비트가 SF이다.

 

663의 binary 값에서 6, 7번째 비트를 확인한다.

ZF의 값이 0, SF의 값이 1인 것을 확인할 수 있다.

 


 

제어문

1) 무조건 분기: jmp 주소

jmp bye

-> bye 레이블로 jump 한다.

 

 

2) 조건 분기: j조건

조건

G(Greater)    크다

L(Less)         작다

E(Equal)       같다

 

if ( a<10 ) {

printf("less than 10\n");

}

C의 IF 문 ->

 

입력한 a가 10 이상이면 end로 이동한다.

 

 

if ( a<10 ) {

printf("less than 10\n");

} else {

printf("more than 10\n");

}

C의 IF...ELSE ->

 

a가 10 이상이면 else로 이동하고, 아니면 남은 코드를 수행한다.

 

 

3) 다중 조건

 

if( (a<10 && b>1) || c==5) ){

printf("correct\n");

}

 

3가지 조건

1) a<10

2) b>1

3) c==5

 

1) 참 -> 2) 참 -> correct

1) 참 -> 2) 거짓 -> 3) 참 -> correct

1) 참 -> 2) 거짓 -> 3) 거짓 -> end

1) 거짓 -> 3) 참 -> correct

1) 거짓 -> 3) 거짓 -> end

-> 모든 경우의 수를 알아보고 어셈블리어로 변환했다.

 

 

'System Hacking' 카테고리의 다른 글

main 함수의 인자 argc, argv  (0) 2018.01.24
함수  (0) 2018.01.23
레지스터(Register)와 사칙연산  (0) 2018.01.18
주소 vs 메모리  (0) 2018.01.16
C언어로 만들어진 프로그램의 실행과정 이해  (0) 2018.01.12