비교 연산과 논리 연산

namu·2022년 7월 1일

#pragma region 비교 연산

언제 필요한가?
ex) 체력이 0이 되면
ex) 체력이 30% 이하이면 궁극기를 발동 (100 * hp / maxHp)
ex) 경험치가 100 이상이면 레벨업

// a == b
// 같으면 1, 다르면 0
bool isSame;
bool isDifferent;
bool isGreater;
bool isSmaller;

isSame = (a == b);
00CE1F98 mov eax, dword ptr [a (0CEC044h)] // h는 hexadecimal
00CE1F9D cmp eax, dword ptr [b (0CEC048h)]
00CE1FA3 jne main+41h (0CE1FB1h)
00CE1FA5 mov dword ptr [ebp-0C4h], 1 // 스택을 임시적인 보관 용도로 사용
00CE1FAF jmp main+4Bh (0CE1FBBh)
00CE1FB1 mov dword ptr [ebp-0C4h], 0
00CE1FBB mov cl, byte ptr [ebp-0C4h]
00CE1FC1 mov byte ptr [isSame (0CEC151h)], cl
// a != b
// 다르면 1, 같으면 0
isDifferent = (a != b);
00CE1FC7 mov eax, dword ptr [a (0CEC044h)]
00CE1FCC cmp eax, dword ptr [b (0CEC048h)]
00CE1FD2 je main+70h (0CE1FE0h)
00CE1FD4 mov dword ptr [ebp-0C4h], 1
00CE1FDE jmp main+7Ah (0CE1FEAh)
00CE1FE0 mov dword ptr [ebp-0C4h], 0
00CE1FEA mov cl, byte ptr [ebp-0C4h]
00CE1FF0 mov byte ptr [isDifferent (0CEC152h)], cl

// a > b
// a >= b
isGreater = (a > b);

// a < b
// a <= b
isSmaller = (a < b);

#pragma endregion

#pragma region 논리 연산
언제 필요한가? 조건에 대한 논리적 사고가 필요할 때
ex) 로그인할 때 아이디도 같고 AND 비밀번호도 같아야 한다
ex) 길드 마스터이거나 OR 운영자 계정이면 길드 해산 가능

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

// ! not
// 0이면 1, 그 외 0
test = !isSame; // 사실상 isDifferent의 의미
00CE2054 movzx eax, byte ptr [isSame (0CEC151h)]
00CE205B test eax, eax // 실질적으로 AND 연산, Zero Flag가 영향을 받음. eax값이 0인지 확인하는 것. Zero Flag는 연산 결과가 0이 아닐 때 1로 세팅되며, 같은 수를 AND했을 때 그 수가 0이 아닌 경우에는 연산 결과가 0이 아닐 것이고, 0일 경우에만 연산 결과가 0일 것이다. 즉, eax가 0인 경우에만 Zero Flag가 세팅된다.
00CE205D jne main+0FBh (0CE206Bh) // eax가 0이 아닌 경우
00CE205F mov dword ptr [ebp-0C4h], 1 // 스택을 메모장처럼 사용
00CE2069 jmp main+105h (0CE2075h)
00CE206B mov dword ptr [ebp-0C4h], 0
00CE2075 mov cl, byte ptr [ebp-0C4h]
00CE207B byte ptr [test (0CEC155h)], cl

// && and
// a && b
test = (hp <= 0 && isInvincible == false);
00CE2081 cmp dword ptr [hp (0CEC04Ch)], 0
00CE2088 jg main+131h (0CE20A1h)
00CE208A movzx eax, byte ptr [isInvincible (0CEC050h)]
00CE2091 test eax, eax
00CE2093 jne main+131h (0CE20A1h)
00CE2095 mov dword ptr [ebp-0C4h], 1
00CE209F jmp main+13Bh (0CE20ABh)
00CE20A1 mov dword ptr [ebp-0C4h], 0
00CE20AB mov cl, byte ptr [ebp-0C4h]
00CE20B1 mov byte ptr [test (0CEC155h)], cl

// || or
// a || b
test = (hp > 0 || isInvincible == true); // !(hp <= 0 && isInvincible == false)
00CE20B7 cmp dword ptr [hp (0CEC04Ch)], 0
00CE20BE jg main+168h (0CE20D8h)
00CE20C0 movzx eax, byte ptr [isInvincible (0CEC050h)]
00CE20C7 cmp eax, 1
00CE20CA je main+168h (0CE20D8h)
00CE20CC mov dword ptr [ebp-0C4h], 0
00CE20D6 jmp std::basic_ostream<Char, std::char_traits >::_Sentry_base::~_Sentry_base+2h (0CE20E2h)
00CE20D8 mov dword ptr [ebp-0C4h], 1
00CE20E2 mov cl, byte ptr [ebp-0C4h]
00CE20E8 mov byte ptr [test (0CEC155h)], cl

조건식의 순서에 따라 성능 차이가 있을 수 있다.

#pragma endregion

profile
안녕하세요

0개의 댓글