어 셈 블 리 에서 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 에 기본 값 을 제공 하지 않 을 것 임 을 짐작 할 수 있 습 니 다.