분기문

namu·2022년 7월 2일

데이터를 메모리에 할당하고 가공하는 방법에 대해 알아봄
가공한 데이터를 이용해서 무언가를 하고 싶다면?

int hp = 100;
int damage = 100;

hp -= damage;
bool isDead = (hp <= 0);

몬스터가 죽었으면 경험치 추가
어셈블리에서 CMP jMP (값을 비교 후 플래그 여부에 따라 점프)

if (조건) 명령문

조건식이 0인지 아닌지 판단

if(isDead)
movzx eax, byte ptr [isDead] // 1바이트만 긁어오고, 나머지 3바이트는 0으로 채워줌.
test eax, eax // 0인지 아닌지
je main+95h(0DB5DB5h) // 0이면 점프
...

isDead == false와 !isDead는 같다.

if else
중복하여 test하지 않음. if 내부를 수행하면, else 부분을 건너뛰어야 함.

if else if else
if else { if else } 와 같음. 가독성 차이.

switch-case-break

switch (input)
mov eax, dword ptr [input]
mov dword ptr [ebp-0F4h], eax
cmp dword ptr [ebp-0F4h], 0
je main+60h (0375D8Dh)
cmp dword ptr [ebp-0F4h], 1
je main+98h (0375DB8h)
cmp dword ptr [ebp-0F4h], 2
je main+0C3h (0375DE3h)
jmp main+0EEh (0375E0Eh)
{
	case ROCK:
    	cout << "바위를 냈습니다" << endl;

컴파일러 최적화할 때 switch가 더 유리하다.
switch문을 jump table로 구현하는 경우가 많기 때문에 if문 보다 좀 더 좋은 성능을 가지고, 컴파일러나 코드 상황에 따라 다르지만 보통 if문이 3개일 때까지는 if else가 더 빠르다고 한다.

switch문에는 정수 계열만 넣을 수 있다. (C#에서는 문자열도 가능)

profile
안녕하세요

0개의 댓글