- "본 강의는 Inflearn에 Rookies 강사님의 강의로 학습하고 있는 내용입니다."-
❗ Ctrl + Alt + D : 어셈블 코드 표시기
사칙연산 일반적으로 수학에서 더하기 빼기, 곱하기 나누기 등등을 얘기한다. 하지만 수학과
프로그래밍에서 조금 차이가 있다. 각 언어마다 표시하는 방법등은 다를 수 있다.
사칙연산은 왜 필요한가?
다양한 이유가 있겠지만 대표적으로
- 데미지계산
- 체력을 깍는다.
- 루프문 카운터를 1 증가 시킨다.
등등 여러 이유가 존재한다. (게임기준)
// int형 정수 자료형에 각각의 입력해준 변수명 a 와 b의 바구니 안에 1 과 2를 넣어줬다.
int a = 1;
int b = 2;
대입연산자
a = b; // a 라는 바구니에 b의 바구니에 있는 값을 a 바구니 안에다 복사한다.
// a 가 2가 복사된다.
00F71852 mov eax,dword ptr [b (0F7A004h)]
00F71857 mov dword ptr [a (0F7A000h)],eax
사칙연산자
덧셈
a = b + 3; // 덧셈 assemble : add
00F7185C mov eax,dword ptr [b (0F7A004h)]
00F71861 add eax,3
00F71864 mov dword ptr [a (0F7A000h)],eax
기본적으로 mov 어셈블 언어를 사용해서 b의 값을 eax 레지스터에 담아서 eax,와 3의 값을 add해주고 eax에 담긴 값을 a에 넣어주는 것을 볼 수 있다.
뺄셈
a = b - 3; // 뺄셈 assemble : sub
00F71869 mov eax,dword ptr [b (0F7A004h)]
00F7186E sub eax,3
00F71871 mov dword ptr [a (0F7A000h)],eax
곱셈
a = b * 3; // 곱셈 assemble : mul
00F71876 imul eax,dword ptr [b (0F7A004h)],3
00F7187D mov dword ptr [a (0F7A000h)],eax
곱셈 부터는 b와 3의 값을 imul을 통해 곱하여주고 eax에 넣어 a에 대입해주는 것을 볼 수 있다.
나눗셈
a = b / 3; // 나눗셈 assemble : div
00F71882 mov eax,dword ptr [b (0F7A004h)]
00F71887 cdq
00F71888 mov ecx,3
00F7188D idiv eax,ecx
00F7188F mov dword ptr [a (0F7A000h)],eax
나머지
a = b % 3; // 나머지 assemble : div
00F71894 mov eax,dword ptr [b (0F7A004h)]
00F71899 cdq
00F7189A mov ecx,3
00F7189F idiv eax,ecx
00F718A1 mov dword ptr [a (0F7A000h)],edx
⚠️ 위에 나머지들도 얼추 비슷한 방식의 내용으로 돌아가며 볼 수 있다.
a += 3; // a = a + 3;
00F718A7 mov eax,dword ptr [a (0F7A000h)]
00F718AC add eax,3
00F718AF mov dword ptr [a (0F7A000h)],eax
a -= 3;
00F718B4 mov eax,dword ptr [a (0F7A000h)]
00F718B9 sub eax,3
00F718BC mov dword ptr [a (0F7A000h)],eax
a *= 3;
00F718C1 imul eax,dword ptr [a (0F7A000h)],3
00F718C8 mov dword ptr [a (0F7A000h)],eax
a /= 3;
00F718CD mov eax,dword ptr [a (0F7A000h)]
00F718D2 cdq
00F718D3 mov ecx,3
00F718D8 idiv eax,ecx
00F718DA mov dword ptr [a (0F7A000h)],eax
a %= 3;
00F718DF mov eax,dword ptr [a (0F7A000h)]
00F718E4 cdq
00F718E5 mov ecx,3
00F718EA idiv eax,ecx
00F718EC mov dword ptr [a (0F7A000h)],edx
형태를 이런식으로 바꿔도 위에 나눠서 하는 것과 별반 차이는 없다.
증감연산자
기본적으로 증감연산자의 풀이는 아래와 같다
a = a + 1;
// 어셈블에서 add eax, 1 -> inc eax
inc를 사용해서 증감을 시켜주었다.
a = a + 1; // add eax, 1 -> inc eax
00F718F2 mov eax,dword ptr [a (0F7A000h)]
00F718F7 add eax,1
00F718FA mov dword ptr [a (0F7A000h)],eax
a++;
00F718FF mov eax,dword ptr [a (0F7A000h)]
00F71904 add eax,1
00F71907 mov dword ptr [a (0F7A000h)],eax
++a;
00F7190C mov eax,dword ptr [a (0F7A000h)]
00F71911 add eax,1
00F71914 mov dword ptr [a (0F7A000h)],eax
a--;
00F71919 mov eax,dword ptr [a (0F7A000h)]
00F7191E sub eax,1
00F71921 mov dword ptr [a (0F7A000h)],eax
--a;
00F71926 mov eax,dword ptr [a (0F7A000h)]
00F7192B sub eax,1
00F7192E mov dword ptr [a (0F7A000h)],eax
증감연산자 또한 뭔가 보기엔 별반 차이 없어 보인다.
그러나 만약에 대입을 하는 상황이면 달라진다.
대입시
b = a++; // 2가지의연산 b = a에 대입 a를 1 증가
00F71933 mov eax,dword ptr [a (0F7A000h)]
00F71938 mov dword ptr [b (0F7A004h)],eax
00F7193D mov ecx,dword ptr [a (0F7A000h)]
00F71943 add ecx,1
00F71946 mov dword ptr [a (0F7A000h)],ecx
b = ++a; // a를 1증가 시키고 -> b = a 대입
00F7194C mov eax,dword ptr [a (0F7A000h)]
00F71951 add eax,1
00F71954 mov dword ptr [a (0F7A000h)],eax
00F71959 mov ecx,dword ptr [a (0F7A000h)]
00F7195F mov dword ptr [b (0F7A004h)],ecx
첫번째 부터 후위증감을 해서 a의 값을 eax에 넣어서 eax의 값을 먼저 b에 넣어준다.
그러고 ecx 레지스터에 a의 값을 넣어 ecx에 1을 더한다. 그러고 다시 더한값을 a에 넣는 것을 볼 수 있다.
두번째에서는 전위증감 같은 경우 먼저 a의 값에 1을 더해서 더한 값을 a에 넣어주고 다시 ecx의 값을 b에 넣어주는 것을 볼 수 있다. 이러한 차이가 있다.
우선순위
b = a + 1 * 3; // 곱셈이 우선순위가 먼저온다. 만약 a+1하고 한다면 괄호를 사용해 감싸주어서 우선순위를 바꾼다.
00F71965 mov eax,dword ptr [a (0F7A000h)]
00F7196A add eax,3
00F7196D mov dword ptr [b (0F7A004h)],eax
모든 프로그래밍 언어에서는 연산자에 대한 우선순위가 존재한다.
기본적으로 위처럼 되었을 경우 수학에서도 곱셈이 우선순위를 갖는것처럼
작동한다. 곱셈이 먼저 실행되고 그다음 + 가 실행된다.
만약 우리가 먼저 더하고 곱해야 하는 상황이면 우선순위가 높은 괄호로 감싸줘야한다.
b = (a + 1) * 3;
'🅿🆁🅾🅶🆁🅰🅼🅼🅸🅽🅶 > C_C++' 카테고리의 다른 글
[C++과 언리얼로 만드는 MMO] C++ 기초_ 비교 연산과 논리 연산[Section3]{(19)} (2) | 2024.09.15 |
---|---|
[C/C++_Doodle]BookReviewing_03_ 입력 받기 (0) | 2023.03.01 |
[C/C++_Doodle]BookReviewing_02 변수와 연산자 (0) | 2023.01.27 |