ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.