-
C++ Reference, Pointer잡다 2014. 10. 13. 10:54
Reference와 Pointer의 역할이나 사용법이 거의 같은데,
어떻게 동작하나 궁금해서 Assembly로 확인해 보았다.
예제 소스)
- C++
#include <iostream>
void test(int &aaa)
{
7 aaa = 100;
}
void pointer(int * bbb)
{
12 *bbb = 200;
}
int main()
{
17 int number = 10;
19 test(number);
20 pointer(&number);
return 0;
}
- Assembly
_number$ = -4 ; size = 4
_main PROC
; Line 16
push ebp
mov ebp, esp
push ecx
; Line 17
mov DWORD PTR _number$[ebp], 10 ; 0000000aH
; Line 19
lea eax, DWORD PTR _number$[ebp] ; 주소 값 넘겨줌
push eax ; 주소 값을 인수로 저장
call ?test@@YAXAAH@Z ; test 함수 호출, test(number);
add esp, 4
; Line 20
lea ecx, DWORD PTR _number$[ebp] ; 주소 값 넘겨줌
push ecx ; 주소 값을 인수로 저장
call ?pointer@@YAXPAH@Z ; pointer 함수 호출, pointer(&number);
add esp, 4
; 두 함수 다 주소 값을 인자로 넘겨줌.
; Line 22
xor eax, eax
; Line 23
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
_aaa$ = 8 ; size = 4
?test@@YAXAAH@Z PROC ; test 함수 시작
; File d:\main.cpp
; Line 6
push ebp
mov ebp, esp
; Line 7
mov eax, DWORD PTR _aaa$[ebp] ; aaa가 가리키는 값(number주소)을 eax에 저장
mov DWORD PTR [eax], 100 ; 00000064H 값을 eax가 가리키는 값에 넣음
; Line 8
pop ebp
ret 0
?test@@YAXAAH@Z ENDP ; test 함수 끝
; 주소 값으로 값의 수정함
_bbb$ = 8 ; size = 4
?pointer@@YAXPAH@Z PROC ; pointer 함수 시작
; Line 11
push ebp
mov ebp, esp
; Line 12
mov eax, DWORD PTR _bbb$[ebp] ; bbb가 가리키는 값(number주소)을 eax에 저장
mov DWORD PTR [eax], 200 ; 000000c8H 값을 eax가 가리키는 값에 넣음
; Line 13
pop ebp
ret 0
?pointer@@YAXPAH@Z ENDP ; pointer 함수 끝
; 주소 값으로 값의 수정함
또 다른 예제)
- C++
#include <iostream>
int main()
{
int number = 10;
int &aaa = number;
int *bbb = &number;
number = 20;
aaa = 100;
*bbb = 1000;
return 0;
}
- Assembly
_aaa$ = -12 ; size = 4
_number$ = -8 ; size = 4
_bbb$ = -4 ; size = 4
_main PROC
; File d:\main.cpp
; Line 6
push ebp
mov ebp, esp
sub esp, 12 ; 0000000cH
; Reference도 메모리를 할당 받는다
; Line 7
mov DWORD PTR _number$[ebp], 10 ; number = 0000000aH
; Line 8
lea eax, DWORD PTR _number$[ebp] ; number 주소를 eax에 저장
mov DWORD PTR _aaa$[ebp], eax ; aaa에 eax 값 넣음, &aaa = number
; Line 9
lea ecx, DWORD PTR _number$[ebp] ; number 주소를 ecx에 저장
mov DWORD PTR _bbb$[ebp], ecx ; bbb에 ecx 값 넣음, *bbb = &number
; Line 11
mov DWORD PTR _number$[ebp], 20 ; number = 00000014H
; Line 12
mov edx, DWORD PTR _aaa$[ebp] ; aaa 값을 edx에 저장
mov DWORD PTR [edx], 100 ; aaa가 가리키는 값에 00000064H을 넣음, aaa = 100;
; Line 13
mov eax, DWORD PTR _bbb$[ebp] ; bbb 값을 eax에 저장
mov DWORD PTR [eax], 1000 ; bbb가 가리키는 값에 000003e8H을 넣음, *bbb = 1000;
; Line 15
xor eax, eax
; Line 16
mov esp, ebp
pop ebp
ret 0
_main ENDP
결국 Pointer나 Reference나 Assembly로 동작 방식은 같다.
'잡다' 카테고리의 다른 글
stm32F10x Standard Peripherals Library (0) 2015.01.12 PCB 설계/제작/조립 관련 사이트 (0) 2014.10.27 microangel 마우스 커서, 아이콘 제작 툴 (0) 2014.09.16 map (0) 2014.09.13 우분투 리눅스 text 모드 부팅 (0) 2014.09.01