4
GCC cdecl
호출 규칙에서 호출이 반환 된 후 스택에 밀어 넣은 인수를 그대로 사용할 수 있습니까? ASM과 C를 혼합하고 최적화 (-O2
)를 사용할 때도? 한마디로CDECL 호출 규칙에서 스택에 밀어 넣은 인수를 다시 사용할 수 있습니까?
GCC cdecl
호출 규칙에서 호출이 반환 된 후 스택에 밀어 넣은 인수를 그대로 사용할 수 있습니까? ASM과 C를 혼합하고 최적화 (-O2
)를 사용할 때도? 한마디로CDECL 호출 규칙에서 스택에 밀어 넣은 인수를 다시 사용할 수 있습니까?
: 그래서를 위해 확실히 가능하다
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 함수
인라인 또는 다른 최적화 마법의 가능성을 고려하지도 않습니다. 처음부터 스택에 스택되지 않을 수도 있습니다.
C 함수가 비 const 인수를 수정하는 것은 완벽하게 괜찮습니다. – Michael
@ 마이클 : ABI는'const' args에 관해서 아무 말도하지 않습니다. 이것은 ABI의 일부가 아니라 소스 레벨의 컴파일 타임입니다. 이것은 컴파일러가 arg-passing 슬롯을 스크래치 공간으로 이용하는 것 같지는 않지만 항상 데이터가 훼손된다고 가정하기 때문에 다소 불행한 일입니다. –