2016-08-09 4 views
4

GCC cdecl 호출 규칙에서 호출이 반환 된 후 스택에 밀어 넣은 인수를 그대로 사용할 수 있습니까? ASM과 C를 혼합하고 최적화 (-O2)를 사용할 때도? 한마디로CDECL 호출 규칙에서 스택에 밀어 넣은 인수를 다시 사용할 수 있습니까?

+0

C 함수가 비 const 인수를 수정하는 것은 완벽하게 괜찮습니다. – Michael

+0

@ 마이클 : ABI는'const' args에 관해서 아무 말도하지 않습니다. 이것은 ABI의 일부가 아니라 소스 레벨의 컴파일 타임입니다. 이것은 컴파일러가 arg-passing 슬롯을 스크래치 공간으로 이용하는 것 같지는 않지만 항상 데이터가 훼손된다고 가정하기 때문에 다소 불행한 일입니다. –

답변

4

: 그래서를 위해 확실히 가능하다

movl $5, 8(%ebp) 
movl $6, 12(%ebp) 
movl 8(%ebp), %edx 
movl 12(%ebp), %eax 
addl %edx, %eax 
popl %ebp 
ret 

:

__cdecl int foo(int a, int b) 
{ 
    a = 5; 
    b = 6; 
    return a + b; 
} 

int main() 
{ 
    return foo(1, 2); 
} 

이 (-O0 컴파일)이 ASM 출력을 제작 : 제

이 코드를 고려 스택 값을 stomp하는 __cdecl 함수

인라인 또는 다른 최적화 마법의 가능성을 고려하지도 않습니다. 처음부터 스택에 스택되지 않을 수도 있습니다.