통화 스택이 하단 또는 상단에서 시작됩니까?


11

스택은 상향식 더미입니다.

따라서 스택이 비워지고 프로그램이 종료 될 때까지 각 함수가 종료 될 때 항목이 스택에서 제거 된 상태에서 함수가 호출되면 호출 스택이 스택에 새 항목을 추가합니다.

위의 내용이 올 바르면 사람들이 콜 스택을 "위로"이동하는 것을 제어하는 ​​이유는 무엇입니까? 확실히 제어 하면 통화 스택이 맨 아래에 도달 할 때까지 아래로 이동 합니다 .


함수가 호출되면 항목이 스택의 맨 위에 추가되고 컨트롤이 해당 함수로 전달됩니다. 따라서 컨트롤은 스택의 기본 항목에서 위쪽 항목으로 이동합니다.
treecoder

1
@greengit : "통화 스택 업"이라는 표현은 예외와 함께 사용되는데, 컨트롤은 실제로 반대 방향으로 움직입니다.
Michael Borgwardt

@MichaelBorgwardt : 맞습니다.
treecoder

1
@MichaelBorgwardt : "오류 가 콜 스택 위로 이동"이라는 표현을 보았습니다 . 확실하지 않습니다.
CJ7

답변:


9

이 사용법에는 두 가지 가능한 이유가 있습니다.

  • 예외 상황에서 컨트롤은 호출 함수 / 메서드로 이동하며,이 호출 계층 구조는 일반적으로 main 메소드가 맨 위에 표시되고 메소드 호출이 계층 레벨을 아래로 형성하며 추상화 레벨이 감소합니다. 이 계층에서는 예외가 위로 이동합니다.

  • 일반 x86 응용 프로그램의 실제 프로그램 스택은 거꾸로됩니다. 즉 아래쪽으로 커집니다. 푸시 / PUSHW / PUSHD 기계 코드 명령어는 감소 스택 포인터를. 다른 아키텍처도이 모델을 공유 할 수 있습니다.


하향식 아이디어가 "스택"이라는 일상적인 개념과 반대되는 것은 아닌가?
CJ7

@CraigJ : 스택 내용의 각 바이트의 비트가 물리적으로 별도의 칩에 저장 될 것입니다. 무슨 상관이야?
Michael Borgwardt

1

그것은 모두 단어의 정의에 달려 있습니다. 이 문맥에서 "상단"과 "하단"이라는 단어와 운영 체제 또는 컴퓨터 아키텍처의 구현에서 정확히 무엇을 의미합니까?

Commodore 64에서 프로그래밍 할 때 오래 전부터 다음을 기억합니다. 주소 $ 0800 (2048)과 $ 9FFF (40959) 사이의 메모리는 BASIC 프로그램 용으로 예약되었습니다. BASIC 프로그램의 코드는 더 낮은 주소에서 시작하여 저장되었습니다 ($ 800). 서브 루틴의 변수 및 리턴 주소를 저장하기위한 스택은 해당 범위의 최상위 ($ 9FFF)에서 시작하여 더 낮은 주소로 커졌습니다. 따라서이 문맥에서 스택이 아래로 커지는 것을 보는 것이 논리적이며, 서브 루틴에서 돌아 왔을 때 스택 포인터를 증가시켜 서브 루틴의 스택 프레임을 버렸습니다. 서브 루틴에서 복귀

Windows 또는 Intel x86 프로세서와 같은 최신 버전에서 어떻게 작동하는지 모르겠습니다. 스택은 다른 방식으로 작동 할 수 있습니다. 즉, 낮은 주소에서 높은 주소로 증가합니다. 이 경우 "top", "bottom"및 "up", "down"이라는 단어를 정확히 다른 방식으로 사용합니다.


0

foo (6, x + 1)과 같은 함수를 호출하려면 ...

  1. 호출자의 컨텍스트에서 x + 1과 같은 실제 매개 변수 표현식을 평가하십시오.
  2. 적절한 "로컬 블록"메모리를이 목적 전용 런타임 "호출 스택"으로 푸시하여 foo () 로컬에 메모리를 할당하십시오. 로컬 변수가 아닌 매개 변수의 경우 (1) 단계의 값을 foo () 로컬 블록의 해당 슬롯에 저장하십시오.
  3. 호출자의 현재 실행 주소 ( "반환 주소")를 저장하고 실행을 foo ()로 전환하십시오.
  4. foo ()는 호출 스택 끝에서 편리하게 사용할 수있는 로컬 블록으로 실행됩니다.
  5. foo ()가 완료되면 스택에서 로컬을 팝하여 종료하고 이전에 저장된 리턴 주소를 사용하여 호출자에게 "반환"합니다. 이제 호출자의 로컬은 스택의 끝에 있으며 실행을 재개 할 수 있습니다.

참고:

http://cslibrary.stanford.edu/102/PointersAndMemory.pdf (p15)


이것은 호출 규칙에 따라 매우 다릅니다. 발신자를 정리하고, 적어도 일부 레지스터 등을 사용하는 호출 규칙이 있습니다.

0

일반 중력 현실에서 테니스 공이 들어있는 실린더와 같이 스택을 상향식으로 개념화하면 함수가 호출 될 때 컨트롤이 스택 위로 올라갑니다. 기능이 완료되면 제어 장치가 스택 아래로 이동합니다.

스택을 테니스 공의 동일한 실린더와 같지만 중력이 거꾸로 된 하향식으로 개념화하면 함수가 호출되면 제어가 스택을 위로 이동하고 함수가 완료되면 스택을 위로 이동합니다.

이것들은 모두 머리 속에있는 모델 일 뿐이며 본질적으로 완전히 임의적입니다. 원한다면 그것을 일대일로 개념화 할 수 있지만 사람들과 의사 소통하는 데 어려움이있을 수 있습니다. 나는 개인적으로 A가 B를 호출하고 B가 C를 호출하면 C가 스택의 맨 아래 (반전 된 중력 현실)이고 C에서 예외가 발생하면 그 예외를 A까지 버블 링하고 싶다고 생각합니다. C가 깊고 A가 최상위라는 느낌이 들기 때문에보다 일반적인 언어 사용법. 첫 번째 기능은 더 직관적으로 나에게 가장 적합하며 각 호출에서 기능이 더 깊어집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.