C++프로그래밍/C 와 C++ 기초실습

산술 연산(디스어셈블리 디버그 테스트)

season97 2024. 9. 15. 22:02

※ C / C++을 이미 알고 있으나 개인적인 공부 및 복습을 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 

대입연산이니 산술연산이니... 기본 개념 스킵스킵

 


ㆍ 어셈블리를 배우고 어셈블리로 돌려 보니 새로운 경험을 하게 되는 것 같다.

 

ㆍ 여러가지 궁금한 것들을 뭐가 더 효율적인지 눈으로 살펴볼 수 있다.

이건똑같다 ㅋㅋ

 

 

 

※ 눈으로 보는 두 연산의 차이점

ㆍ 다르다는건 알고있었다. 하지만 정확하게 알 수 있다. 

1. b = a++ (후위 증가연산)

    1)  mov eax, dword ptr [a]

          ㆍ 메모리에서 변수 a의 값을 읽어와 레지스터 eax에 저장 

    2)  mov dword ptr [b], eax

          ㆍ eax의 값을 변수 b에 저장... 이 시점에서 b는 원래 a의 값을 가지게된다

    3)  mov ecx, dword ptr [a]

          ㆍ 다시 메모리에서 a의 값을 읽어와 레지스터 ecx에 저장
    4)  add ecx, 1

          ㆍ ecx의 값을 1 증가시킴
    5)  mov dword ptr [a], ecx

          ㆍ 증가된 값을 다시 a에 저장, 이제 a는 원래 값보다 1 증가한 상태

1. b = ++a (전위 증가연산)

    1)   mov eax,dword ptr [a (0DAA000h)]

          ㆍ 메모리에서 변수 a값을 읽어와 레지스터 eax에 저장

    2)  add eax,1

          ㆍ eax의 값을 1 증가시킨다. 이 시점에 eax는 a값보다 1 큰 값을 가지고있다.

    3)  mov dword ptr [a (0DAA000h)], eax

          ㆍ 증가된 값을 다시 a에 저장한다. 이제 a는 1 증가한 상태다
    4)  mov ecx,dword ptr [a (0DAA000h)]

          ㆍ 증가된 값을 다시 메모리에서 읽어와 ecx에 저장한다. 
    5)  mov dword ptr [b (0DAA004h)], ecx

          ㆍ  이제 ecx의 값을 변수 b에 저장한다. 이 시점에서 b는 a의 증가된 값을 가진다.

 

※ 요약 및 정리 

ㆍ 후위증가 b = a++  :  b는 a의 원래 값, a는 1 증가

ㆍ 전위증가 b = ++a   : a는 1 증가 ,b는 증가된a의 값

 

※ C++코딩하면서 메모리창과 디스어셈블리 등등의 요소를 이용해 디버그를 돌리면 추후 개발할 때 좋을것같다.

 

'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글

비트연산과 비트플래그  (1) 2024.09.16
비교연산과 논리연산 (디스어셈블리 디버그)  (0) 2024.09.15
문자와 문자열 (유니코드)  (2) 2024.09.15
bool과 부동소수점  (1) 2024.09.15
정수  (0) 2024.09.15