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

설정

트랙백

댓글