2013-12-12 1 views
0

는 나도 몰라,하지만 난 런타임 스택을 공부하고 난 다음 C 코드가 있습니다런타임은

int main() { 
    int a, b, c , x; 
    a = 4; 
    b = 5 
    c = 6 
    x = func(a, b, c); 
    return; 
} 
int func(int x, int y, int z) { 
    int p, q, r; 
    p = x*x; 
    q = y/z; 
    r = p + q; 
    return r; 
} 

이것은이다 컴파일되고 x3000 위치에로드됩니다.

저는 시뮬레이션 된 컴퓨터 lc3을 다루고 있습니다. 이 코드가 실행될 때 런타임 스택이 어떻게 보이는지 알아야합니다. 화제의 나의 이해는 실제로이 문제를 해결하기 위해 너무 제한되어 있지만, 여기에 내가 보이게한다고 생각하는 방법입니다

x0000 
     (I don't know how the return should look either) 
     (Assignments that I don't know how to interpret) 
     r 
     q 
     p 
     main's frame pointer 
     Return address to main 
     Return value to main 
     x a 
     y b 
     z c 
     (I don't know the assignments should look in the run-time stack) 
     x 
     c 
     b 
     a 
xEFFF 

나는 누군가가 나에게이 주제에 약간의 선명도를 제공 할 수 있기를 바랍니다. 미리 감사드립니다.

답변

0

좋아,이 모든 것은 사용중인 ABI에 따라 다릅니다. SystemV x86 Abi (32 비트 Linux의 경우)과 비슷한 경우. 그것은 당신이 묘사 한 것과 같아야합니다. (내 답변을 wikipedia describes for LC-3과 일치하도록 수정했습니다.)

먼저 main()에 도달하고 4 개의 로컬 변수가 있으며 각각은 int입니다. (각 int 가정하면 4 바이트 및 4 바이트 정렬 스택), 그것들은 저장 될 것이다

0xEFFC: a 
0xEFF8: b 
0xEFF4: c 
0xEFF0: x 

는 그런 다음 기능, 즉 func() 전화.

0xEFEC: z --> c 
0xEFE8: y --> b 
0xEFE4: x --> a 

는 그런 다음, 반환 값에 대한 공간을 절약 반환 주소를 넣어 저장해야합니다 당신의 R5를 : :이 LC-3 ABI는 매개 변수가 왼쪽으로 rigth에서, 스택에 전달해야한다고 말한다

다시
0xEFE0: Return value 
0xEFDC: Return address to main 
0xEFD8: Space for R5 

지역 변수 : 현대 시스템에서

0xEFD4: p 
0xEFD0: q 
0xEFCC: r 

는, 반환 값은 (EAX 같은) 레지스터에 전달 될 수 있습니다. 그것은 당신의 ABI에 따라 달라집니다. 아마 스택에 반환 될 수도 있습니다.

또 다른 점은 각 함수가 스택 프레임을 만들고 부모의 기본 스택 주소를 스택으로 밀어 넣을 수 있으며 해당 스택에서 시작한다고 가정합니다.

이 모든 것이 정의 된 문서가 있어야합니다.

관련 문제