평생 공부하는 빠타박스 블로그 : Learning is Happiness
article thumbnail
SMALL

- "본 강의는 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; 
728x90
728x90
LIST
profile

평생 공부하는 빠타박스 블로그 : Learning is Happiness

@공부하는 PPATABOX

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!