어셈블리

어셈블리로 보는 비교연산

우대비 2022. 8. 16. 14:52
반응형
int a = 1;
int b = 2;

bool isSame;
bool isDifferent;
bool isGreater;
bool isSmaller;

bool test;
int hp = 100; 
bool isInvincible = true;

int main()
{
#pragma region 비교 연산

	isSame = (a == b);		// 둘의 값이 같은가?
	isDifferent = (a != b);		// 둘의 값이 다른가?
	isGreater = (a >= b);
	isGreater = (a > b);
	isSmaller = (a <= b);
	isSmaller = (a < b);


	


#pragma endregion

#pragma region 논리 연산
	test = !isSame; // isSame의 반대값이 저장됨

	// a && b -> 둘 다 1이면 1, 둘 중 하나라도  0이면 0
	test = (hp <= 0 && isInvincible == false); 
	
	// a || b -> 둘 중 하나라도 1이면 1, 둘다 0이면 0
	test = (hp > 0 || isInvincible == true);




#pragma endregion 
}
isSame = (a == b);
    1. 00BD5245  mov         eax,dword ptr [a (0BDA040h)]  
    2. 00BD524A  cmp         eax,dword ptr [b (0BDA044h)]  
    3. 00BD5250  jne         __$EncStackInitStart+32h (0BD525Eh)  
    4. 00BD5252  mov         dword ptr [ebp-0C4h],1  
    5. 00BD525C  jmp         __$EncStackInitStart+3Ch (0BD5268h)  
    6. 00BD525E  mov         dword ptr [ebp-0C4h],0  
    7. 00BD5268  mov         cl,byte ptr [ebp-0C4h]  
    8. 00BD526E  mov         byte ptr [isSame (0BDA149h)],cl

1. eax에 a의 값을 넣음

2. eax와 b를 비교

3.비교한 값이 서로 다르면 0BD626E(6번)로 점프 

   4. 값이 같으면 어딘가(enp-0C4h)에 1을 저장

   5. 0BD5268 (7번)로 점프

6. 값이 다르면 어딘가(enp-0C4h)에 0을 저장

7. cl에  enp-0C4h의 값을 넣음

8. isSame에 cl의 값을 넣음

 

test = !isSame;
    1. 00BD535F  movzx       eax,byte ptr [isSame (0BDA149h)]  
    2. 00BD5366  test        eax,eax  
    3. 00BD5368  jne         __$EncStackInitStart+14Ah (0BD5376h)  
    4. 00BD536A  mov         dword ptr [ebp-0C4h],1  
    5. 00BD5374  jmp         __$EncStackInitStart+154h (0BD5380h)  
    6. 00BD5376  mov         dword ptr [ebp-0C4h],0  
    7. 00BD5380  mov         cl,byte ptr [ebp-0C4h]  
    8. 00BD5386  mov         byte ptr [test (0BDA14Dh)],cl

1.eax에 isSame의 값을 넣음 (movzx = 왼쪽 비트들를 0으로 채움)

2. eax가 0인지 확인

3. 0이 아니면 점프 (6번으로)

   4. 어딘가(dbp-0C4h)에 1을 넣음

   5. 점프 (7번으로)

6. 어딘가(dbp-0C4h)에 0을 넣음

7. cl에 dbp-0C4h의 값을 넣음

8. test에 cl의 값을 넣음

 

test = (hp <= 0 && isInvincible == false); 
    1. 00BD538C  cmp         dword ptr [hp (0BDA048h)],0  
    2. 00BD5393  jg          __$EncStackInitStart+180h (0BD53ACh)  
    3. 00BD5395  movzx       eax,byte ptr [isInvincible (0BDA04Ch)]  
    4. 00BD539C  test        eax,eax  
    5. 00BD539E  jne         __$EncStackInitStart+180h (0BD53ACh)  
    6. 00BD53A0  mov         dword ptr [ebp-0C4h],1  
    7. 00BD53AA  jmp         __$EncStackInitStart+18Ah (0BD53B6h)  
    8. 00BD53AC  mov         dword ptr [ebp-0C4h],0  
    9. 00BD53B6  mov         cl,byte ptr [ebp-0C4h]  
    10. 00BD53BC  mov         byte ptr [test (0BDA14Dh)],cl

1. hp와 0을 비교

2. hp가 0보다 크면 8번으로 점프

   3. isInvincible의 값을 eax에 넣음

   4. eax가 0인지 테스트

   5. 0이 아니면 8번으로 점프

   6. 어딘가(edp-0C4h)에 1을 넣음

   7. 9번으로 점프

8. 어딘가(edp-0C4h)에 0을 넣음

9. cl 에 (edp-0C4h의 값을 넣음

10. test에 cl의 값을 넣음

 - hp가 0보다 크다는게 확인되면 뒤의 연산은 확인도 안하고 0을 내보냄

반응형
LIST

'어셈블리' 카테고리의 다른 글

어셈블리로 보는 비트연산  (0) 2022.08.16
어셈블리로 보는 산술연산 과정  (0) 2022.08.16
어셈블리 함수 기초  (0) 2022.08.11
어셈블리 배열과 주소  (0) 2022.08.11
어셈블리 반복문  (0) 2022.08.11