어 셈 블 리 에서 c++에서 참조 및 포인터 사용 분석

먼저 인용 상황 에서 의 c++소스 코드:

void add(int a, int b, int&c) {
    c = a + b;
}


int main() {
    int a = 1;
    int b = 2;
    int c = 0;
    add(a, b, c);

}

다음은 main 에 대응 하 는 외환 코드 입 니 다.

; 6    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ; 12byte, a,b, c

; 7    :     int a = 1;

    mov    DWORD PTR _a$[ebp], 1; a _a$ a ebp

; 8    :     int b = 2;

    mov    DWORD PTR _b$[ebp], 2; b _b$ b ebp

; 9    :     int c = 0;

    mov    DWORD PTR _c$[ebp], 0; c _c$ c ebp

; 10   :     add(a, b, c);
    lea    eax, DWORD PTR _c$[ebp]; c ebp ( c ), eax
    push    eax; c
    mov    ecx, DWORD PTR _b$[ebp]; b ( b ) ecx
    push    ecx; b
    mov    edx, DWORD PTR _a$[ebp]; a ( a ) edx
    push    edx; a

    ; push eax push ecx push edx a,b,c , c , c
    ; , a,b , , ; c ,
    call    ?add@@YAXHHAAH@Z            ; add ,
    add    esp, 12                    ; add , ,
                                ; ,

; 11   :    
; 12   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0

다음은 함수 add 에 대응 하 는 외환 코드 입 니 다.

; 1    : void add(int a, int b, int&c) {

    push    ebp
    mov    ebp, esp

; 2    :     c = a + b;

    mov    eax, DWORD PTR _a$[ebp]; a eax
    add    eax, DWORD PTR _b$[ebp]; b eax a , eax
    mov    ecx, DWORD PTR _c$[ebp]; c ecx
    mov    DWORD PTR [ecx], eax; eax ecx , c

; 3    : }

    pop    ebp
    ret    0

위 에서 볼 수 있 듯 이 전송 값 에 대해 c++는 확실히 값 복사 입 니 다.인용 에 대해 서 는 전송 값 의 형식 이지 만 사실은 컴 파일 러 내부 에서 전달 할 가치 가 있 는 주소 입 니 다.
다음은 지침 의 상황 의 c++소스 코드:

void add(int a, int b, int* c) {
    *c = a + b;
}


int main() {
    int a = 1;
    int b = 2;
    int c = 0;
    add(a, b, &c);

}

mian 함수 에 대응 하 는 외환 코드:

; 6    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ;

; 7    :     int a = 1;

    mov    DWORD PTR _a$[ebp], 1

; 8    :     int b = 2;

    mov    DWORD PTR _b$[ebp], 2

; 9    :     int c = 0;

    mov    DWORD PTR _c$[ebp], 0

; 10   :     add(a, b, &c);

    lea    eax, DWORD PTR _c$[ebp]
    push    eax
    mov    ecx, DWORD PTR _b$[ebp]
    push    ecx
    mov    edx, DWORD PTR _a$[ebp]
    push    edx
    call    ?add@@YAXHHPAH@Z            ; add
    add    esp, 12                    ;
; 11   :    
; 12   : }

    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0

add 함수 에 대응 하 는 외환 코드:

; 1    : void add(int a, int b, int* c) {

    push    ebp
    mov    ebp, esp

; 2    :     *c = a + b;

    mov    eax, DWORD PTR _a$[ebp]
    add    eax, DWORD PTR _b$[ebp]
    mov    ecx, DWORD PTR _c$[ebp]
    mov    DWORD PTR [ecx], eax

; 3    : }

    pop    ebp
    ret    0

를 볼 수 있 습 니 다.지침 은 인 용 된 외환 코드 와 같 기 때문에 이들 의 역할 도 마찬가지 입 니 다.

좋은 웹페이지 즐겨찾기