-
덧셈 연산 어셈블리 코드 간단 분석개발/C·C++ 2024. 9. 7. 00:29
다음 코드를 어셈블리로 봐보자.
for (int i = 0; i < 100000; ++i) ++counter;
00007FF6993C57AA mov rax,qword ptr [counter] 00007FF6993C57B1 mov eax,dword ptr [rax] 00007FF6993C57B3 inc eax 00007FF6993C57B5 mov rcx,qword ptr [counter] 00007FF6993C57BC mov dword ptr [rcx],eax
1. mov rax, qword ptr [counter]
- counter 변수의 주소값을 rax 레지스터가 담는다
- 주소이기 때문에 8바이트를 읽어야 하므로 qword ptr이 사용된다
2. mov eax, dword ptr [rax]
- rax의 주소가 가리키는 값을 역참조하기 위해 [] 연산자를 사용해 [rax]를 하고 4바이트를 읽어 eax 레지스터에 담는다
- 여기서 알아야 할 것은 [] 연산자가 메모리에 있는 데이터에 쓰일 때와 레지스터에 쓰일 때가 다르다는 것
- 메모리에 있는 데이터에 쓰일 때는 주소값이며, 레지스터에 쓰일 때는 * 연산자처럼 주소가 가리키는 값을 역참조
- 레지스터는 직접적인 주소를 가지지 않는다는 특성을 생각해보자
3. inc eax
- eax의 값을 1 증가한다
4. mov rcx, qword ptr [counter]
- counter의 변수의 메모리 주소를 rcx 레지스터로 가져온다
- 다시 counter의 주소를 가져오는 이유는 rax의 값이 변경되었기 때문이다
- 변경된 이유는 eax 레지스터가 rax 레지스터의 하위 32비트이기 때문이다
- eax를 사용할 때 rax 레지스터의 상위 32비트는 0으로 초기화된다
5. mov dword ptr [rcx], eax
- eax 레지스터에 저장된 값을 rcx의 주소가 역참조하고 있는 값으로 할당한다
- int형 정수니까 4바이트를 쓰기 위해 dword ptr를 사용한다
'개발 > C·C++' 카테고리의 다른 글
64비트 시스템에서 메모리 정렬 경계에 대해 (0) 2024.10.11 포인터 붕괴와 붕괴가 아닌 것 (0) 2024.09.28 std::transform()에 대한 간단한 고찰 (2) 2024.09.04 포인터의 타입 추론 (0) 2024.08.31 [사소한 테스트] 곱셉/나머지 연산의 로직을 덧셈/뺄셈으로 변경한다면? (1) 2024.08.28