※ 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 |