어 셈 블 리 에서 c+함수 의 기본 매개 변수 사용 설명

c++에 서 는 함수 에 기본 인 자 를 제공 할 수 있 습 니 다.그러면 함 수 를 호출 할 때 인 자 를 제공 하지 않 으 면 컴 파일 러 는 함수 에 기본 값 을 제공 합 니 다.다음은 어 셈 블 리 에서 그 원 리 를 본다.
다음은 c++소스 코드:

int add(int a = 1, int b = 2) {// a b
    return a + b;
}
int main() {
   int c= add();//

}
다음은 mian 함수 안의 외환 코드 입 니 다.

; 4    : int main() {

    push    ebp
    mov    ebp, esp
    push    ecx; c 4 ecx 32

; 5    :    int c= add();

    push    2; 2 , add b
    push    1; 1 , add a
    call    ?add@@YAHHH@Z                ; add
    add    esp, 8; add
    mov    DWORD PTR _c$[ebp], eax;eax add , c

; 6    :   
; 7    : }

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

다음은 add 함수 의 외환 코드 입 니 다.

?add@@YAHHH@Z PROC                    ; add

; 1    : int add(int a = 1, int b = 2) {

    push    ebp
    mov    ebp, esp

; 2    :     return a + b;

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

; 3    : }

    pop    ebp
    ret    0
?add@@YAHHH@Z ENDP

다음은 하나의 매개 변수 만 제공 하 는 가치 가 있 는 상황 입 니 다.
먼저 c++소스 코드:

int add(int a = 1, int b = 2) {// a b
    return a + b;
}
int main() {
   int a = 3;
   int c= add(a);// a

}
다음은 main 함수 의 외환 코드 입 니 다.

; 4    : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 8;esp 8 , a,c

; 5    :    int a = 3;

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

; 6    :    int c= add(a);//

    push    2; 2 , b
    mov    eax, DWORD PTR _a$[ebp]; a , eax
    push    eax; eax , a , 1
    call    ?add@@YAHHH@Z                ; add
    add    esp, 8; add 8byte
    mov    DWORD PTR _c$[ebp], eax;eax , c

; 7    :   
; 8    : }

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

위 와 다른 점 은 a 에 기본 적 인 매개 변수 값 을 제공 하지 않 았 다 는 것 입 니 다.
다음은 add 함수 의 외환 인 코딩 입 니 다.첫 번 째 상황 과 마찬가지 로 변화 가 없습니다.

?add@@YAHHH@Z PROC                    ; add

; 1    : int add(int a = 1, int b = 2) {// a b

    push    ebp
    mov    ebp, esp

; 2    :     return a + b;

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

; 3    : }

    pop    ebp
    ret    0
?add@@YAHHH@Z ENDP

여 기 는 매개 변수 a 에 명확 한 값 을 제 시 했 기 때문에 컴 파일 러 는 매개 변수 b 에 만 기본 값 을 제공 합 니 다.add 함수 에 명확 한 매개 변수 값 을 제공 하면 컴 파일 러 는 매개 변수 a,b 에 기본 값 을 제공 하지 않 을 것 임 을 짐작 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기