콜 스택
Call stack컴퓨터 과학에서 콜 스택은 컴퓨터 프로그램의 활성 서브루틴에 대한 정보를 저장하는 스택 데이터 구조입니다.이러한 종류의 스택은 실행 스택, 프로그램 스택, 제어 스택, 런타임 스택 또는 머신 스택이라고도 하며, 종종 단순히 "스택"으로 단축됩니다.대부분의 소프트웨어가 올바르게 기능하기 위해서는 콜스택의 유지보수가 중요하지만 일반적으로 상세 내용은 숨겨져 있으며 고급 프로그래밍 언어에서는 자동으로 이루어집니다.많은 컴퓨터 명령 집합은 스택을 조작하기 위한 특별한 명령을 제공합니다.
콜 스택은 관련된 여러 목적으로 사용되지만 콜 스택을 사용하는 주된 이유는 각 액티브서브루틴이 실행을 종료했을 때 제어를 반환해야 하는 포인트를 추적하기 위해서입니다.액티브한 서브루틴은 호출되었지만 아직 실행이 완료되지 않은 서브루틴이며, 그 후 제어가 콜 포인트로 반환되어야 합니다.이러한 서브루틴의 액티베이션은 임의의 레벨(특수 케이스로서 재발)에 네스트 할 수 있기 때문에 스택구조가 됩니다.예를 들어 서브루틴이DrawSquare
서브루틴을 호출하다DrawLine
4개의 다른 장소에서,DrawLine
는 실행이 완료되면 반환할 위치를 알고 있어야 합니다.이 작업을 수행하려면 다음 명령 뒤에 있는 주소로 점프합니다.DrawLine
리턴 주소는 콜마다 콜스택 상단에 푸시됩니다.
묘사
콜 스택은 스택으로 구성되어 있기 때문에 발신자는 리턴 주소를 스택에 푸시합니다.콜이 완료되면 착신측 서브루틴은 콜스택에서 리턴 주소를 풀 또는 팝하여 해당 주소로 제어를 전송합니다.착신측 서브루틴이 다른 서브루틴을 호출했을 경우, 그 서브루틴은 다른 리턴 주소를 콜스택에 푸시 하는 등, 프로그램의 지시에 따라서 정보가 축적되어 스택 해제됩니다.푸시가 콜 스택에 할당된 공간을 모두 소비하는 경우 스택오버플로라고 불리는 오류가 발생하여 일반적으로 프로그램이 크래시됩니다.서브루틴의 엔트리를 콜스택에 추가하는 것을 「감기」라고 하는 경우도 있습니다.반대로 엔트리를 삭제하는 것은 「감기 해제」라고 불립니다.
일반적으로 실행 중인 프로그램(또는 프로세스의 각 태스크 또는 스레드)에는 정확히1개의 콜스택이 관련지어져 있습니다만, 신호 처리 또는 공동 멀티태스킹(setcontext와 같이)용으로 추가 스택이 작성될 수 있습니다.이 중요한 컨텍스트에는 1개밖에 없기 때문에 스택이라고 할 수 있습니다('작업의'를 명시적으로 나타냅니다).다만, 4번째 프로그래밍 언어에서는 데이터 스택 또는 파라미터 스택은 콜스택보다 명시적으로 액세스 되어 일반적으로 스택이라고 불립니다(아래 참조).
고급 프로그래밍 언어에서는 일반적으로 콜스택의 자세한 내용은 프로그래머로부터 숨겨집니다.스택 자체에 있는 메모리가 아니라 기능 세트에만 액세스할 수 있습니다.이것은 추상화의 예시입니다.반면 대부분의 어셈블리 언어에서는 프로그래머가 스택 조작에 관여해야 합니다.프로그래밍 언어로 스택의 실제 세부 정보는 컴파일러, 운영 체제 및 사용 가능한 명령 집합에 따라 달라집니다.
콜 스택의 기능
전술한 바와 같이 콜스택의 주된 목적은 리턴 주소를 저장하는 것입니다.서브루틴이 호출되면 나중에 호출 루틴을 재개할 수 있는 명령의 위치(주소)를 어딘가에 저장해야 합니다.스택을 사용하여 리턴 주소를 저장하면 착신 서브루틴 시작 전이나 다른 고정 위치에 리턴 주소를 저장하는 등 일부 대체 콜링 규칙에 비해 중요한 이점이 있습니다.하나는 각 태스크가 자체 스택을 가질 수 있기 때문에 서브루틴은 스레드 세이프가 될 수 있습니다.즉, 다른 작업을 수행하는 다른 태스크에 대해 동시에 활성화될 수 있습니다.또 다른 이점은 재진입 기능을 제공함으로써 재귀가 자동으로 지원된다는 것입니다.함수가 재귀적으로 호출할 경우 함수의 액티베이션마다 반환 주소를 저장해야 함수의 액티베이션에서 나중에 반환 주소를 사용할 수 있습니다.스택 구조는 이 기능을 자동으로 제공합니다.
언어, 운영체제시스템 및 머신 환경에 따라서는 콜스택은 다음과 같은 추가 목적에 도움이 될 수 있습니다.
- 로컬 데이터 스토리지
- 서브루틴은 로컬 변수 값(액티브 서브루틴 내에서만 알려져 반환된 후에는 값을 유지하지 않는 변수)을 저장하기 위한 메모리 공간이 자주 필요합니다.대부분의 경우 스택의 상단을 단순히 공간을 확보할 수 있을 정도로 이동시키는 것만으로 이 용도로 공간을 할당하는 것이 편리합니다.이는 힙 공간을 사용하는 동적 메모리 할당에 비해 매우 빠른 속도입니다.서브루틴의 개별 액티베이션은 로컬용으로 스택 내에서 독자적인 공간을 얻는 것에 주의해 주세요.
- 매개 변수 전달
- 서브루틴에서는 파라미터의 값을 호출하는 코드에 의해 서브루틴에 제공해야 하는 경우가 많아 이들 파라미터의 공간이 콜스택에 배치되는 것은 드문 일이 아닙니다.일반적으로 작은 파라미터가 몇 개밖에 없는 경우에는 프로세서레지스터를 사용하여 값을 전달합니다만, 이 방법으로 처리할 수 있는 파라미터보다 많은 파라미터가 있는 경우에는 메모리 용량이 필요합니다.콜 스택은 이들 파라미터의 장소로서 기능합니다.특히 파라미터 값이 다른 서브루틴에 대한 각 콜에는 콜스택 상에서 이들 값에 대해 별도의 공간이 할당되기 때문입니다.
- 평가 스택
- 산술 연산 또는 논리 연산을 위한 연산자는 대부분의 경우 레지스터에 배치되어 그곳에서 연산됩니다.그러나 상황에 따라서는 오퍼랜드가 임의의 깊이까지 쌓일 수 있습니다.즉, 레지스터 이상의 것을 사용해야 합니다(이것은 레지스터 스필링의 경우).이러한 오퍼랜드의 스택은 RPN 계산기와 마찬가지로 평가 스택이라고 불리며 콜스택의 공간을 차지할 수 있습니다.
- 현재 인스턴스에 대한 포인터
- 일부 객체 지향 언어(C++ 등)에서는 메서드를 호출할 때 이 포인터를 함수 인수와 함께 콜스택에 저장합니다.이 포인터는 호출되는 메서드와 관련된 오브젝트인스턴스를 가리킵니다
- 서브루틴 콘텍스트를 봉입하는 중
- 일부 프로그래밍 언어(예: Pascal 및 Ada)는 중첩된 서브루틴의 선언을 지원하며, 외부 루틴의 범위 내의 파라미터와 로컬 변수와 같은 주변 루틴의 컨텍스트에 액세스할 수 있습니다.이러한 정적 중첩은 반복될 수 있습니다(함수 내에서 선언된 함수 내에서 선언된 함수…).실장에서는, 임의의 스태틱네스트 레벨의 착신측 함수가, 각 엔클로징네스트 레벨의 엔클로징 프레임을 참조할 수 있는 수단을 제공할 필요가 있습니다.일반적으로 이 참조는 '다운스택링크' 또는 '스태틱링크'라고 불리는 엔클로징 함수의 가장 최근에 활성화된 인스턴스의 프레임에 대한 포인터에 의해 구현되어 직접 발신자를 참조하는 '다이나믹링크'(스태틱 부모함수일 필요는 없습니다)와 구별됩니다.
- 스태틱 링크 대신 둘러싸인 스태틱 프레임에 대한 참조를 원하는 프레임을 찾기 위해 인덱스를 붙이는 디스플레이로 알려진 포인터 배열로 수집할 수 있다.루틴의 어휘 중첩 깊이는 알려진 상수이므로 루틴의 표시 크기는 고정됩니다.또, 트래버스 하는 격납 스코프의 수를 알고 있어 표시중의 인덱스를 고정한다.통상, 루틴의 디스플레이는 독자적인 스택 프레임에 배치됩니다만, Burroughs B6500은, 최대 32 레벨의 스태틱 네스트를 서포트하는 하드웨어에 이러한 디스플레이를 실장했습니다.
- 스코프를 포함한 표시 엔트리는, 발신자 표시의 적절한 프리픽스에서 취득됩니다.내부 루틴이 반복되면 호출마다 개별 콜프레임이 생성됩니다.이 경우 내부 루틴의 모든 정적 링크는 동일한 외부 루틴 컨텍스트를 가리킵니다.
- 기타 반품 상태
- 반환 주소 외에 일부 환경에서는 서브루틴이 반환될 때 복원해야 하는 다른 기계 또는 소프트웨어 상태가 있을 수 있습니다.여기에는 권한 수준, 예외 처리 정보, 산술 모드 등이 포함될 수 있습니다.필요한 경우 리턴 주소와 마찬가지로 콜스택에 저장할 수 있습니다.
일반적인 콜 스택은 리턴 주소, 로컬 및 파라미터(콜프레임이라고 불립니다)에 사용됩니다.환경에 따라서는 콜스택에 할당되어 있는 기능이 많거나 적을 수 있습니다.예를 들어 Fourth 프로그래밍 언어에서는 통상 리턴 주소, 카운트된 루프 파라미터 및 인덱스 및 로컬 변수만이 콜스택(그 환경에서는 리턴 스택이라고 불립니다)에 저장됩니다.다만, 콜 스택에는, 필요에 따라서, 특별한 리턴 스택 처리 코드를 사용해 일시적으로 데이터를 배치할 수 있습니다.콜과 리턴은 존중됩니다.파라미터는 보통 별도의 데이터 스택 또는 파라미터 스택에 저장됩니다.일반적으로 콜스택이 있는 경우에도 일반적으로는 4번째 용어로 스택이라고 불립니다.이는 콜스택은 보다 명시적으로 액세스되기 때문입니다.일부 포스에는 부동소수점 파라미터의 세 번째 스택도 있습니다.
구조
콜 스택은 스택프레임(액티베이션레코드 또는 액티베이션프레임이라고도 불립니다)으로 구성됩니다.서브루틴 상태 정보를 포함하는 머신 의존형 및 ABI 의존형 데이터 구조입니다.각 스택 프레임은 리턴으로 종료되지 않은 서브루틴에 대한 콜에 대응합니다.예를 들어 서브루틴이DrawLine
서브루틴에 의해 호출되어 현재 실행 중입니다.DrawSquare
콜 스택의 윗부분은 인접한 그림과 같이 배치되어 있을 수 있습니다.
이와 같은 그림은 탑의 배치와 스택의 성장 방향을 이해하는 한 어느 방향으로든 그릴 수 있습니다.게다가 이것과는 별개로, 아키텍처는 콜 스택이 더 높은 주소로 증가하는지 또는 더 낮은 주소로 증가하는지 여부에 따라 다릅니다.이 다이어그램의 논리는 주소 지정 선택과는 무관합니다.
스택 상부에 있는 스택프레임은 현재 실행 중인 루틴용이며 프레임 내의 정보(파라미터나 로컬 변수 등)에 임의의 [1]순서로 액세스 할 수 있습니다.스택 프레임에는 보통 다음 항목(푸시 순서)이 적어도 포함됩니다.
- 루틴에 전달된 인수(매개변수 값) (있는 경우)
- 루틴의 발신자에게 반송하는 주소(예:
DrawLine
스택 프레임, 주소DrawSquare
의 코드) 및 - 루틴의 로컬 변수 공간(있는 경우)
스택 및 프레임 포인터
스택 프레임사이즈가 다를 수 있는 경우(예를 들어 다른 기능이나 특정 함수의 호출 간에) 스택에서 프레임을 꺼내는 것은 스택포인터의 고정 축소를 구성하지 않습니다.함수가 반환되면 스택포인터는 대신 함수가 호출되기 직전 스택포인터 값인 프레임포인터로 복원됩니다.각 스택 프레임에는 바로 아래 프레임의 맨 위에 스택포인터가 있어요스택 포인터는 모든 호출 간에 공유되는 가변 레지스터입니다.함수의 특정 호출 프레임 포인터는 함수가 [2]호출되기 전과 마찬가지로 스택 포인터의 복사본입니다.
프레임 내의 다른 모든 필드의 위치는 프레임의 맨 위, 스택포인터의 네거티브오프셋 또는 프레임 포인터의 맨 위와의 상대적인 오프셋으로 정의할 수 있습니다.프레임 포인터의 위치 자체는 본질적으로 스택 포인터의 음의 오프셋으로 정의되어야 합니다.
발신자 프레임에 주소 저장
대부분의 시스템에서 스택프레임에는 프레임 포인터 레지스터의 이전 값, 즉 발신자가 실행 중일 때 가졌던 값을 포함하는 필드가 있습니다.예를 들어 스택프레임의DrawLine
프레임 포인터 값을 유지하는 메모리 위치를 가집니다.DrawSquare
사용방법(위 그림에는 나와 있지 않습니다).값은 서브루틴 입력 시 저장되며 반환 시 복원됩니다.스택 프레임내의 기존의 장소에 이러한 필드를 가지는 것으로써, 코드는 현재 실행중의 루틴의 프레임아래에 있는 각 프레임에 차례차례 액세스 할 수 있게 되어, 또한, 루틴이 프레임 포인터를 되돌리기 직전에, 간단하게 콜자의 프레임에 복원할 수 있게 된다.
사전 중첩된 루틴
네스트된 서브루틴을 지원하는 프로그래밍 언어에는 콜 프레임에 착신자를 가장 밀접하게 캡슐화하는 프로시저의 최신 액티베이션, 즉 콜자의 즉시 스코프를 나타내는 필드가 있습니다.이것은 액세스링크 또는 스태틱링크라고 불리며(다이나믹콜 및 재귀콜 중에 스태틱네스팅을 추적하기 때문에), 모든 네스팅레벨에서 캡슐화 루틴의 로컬데이터에 대한 루틴(및 다른 루틴도 호출할 수 있습니다) 액세스를 제공합니다.일부 아키텍처, 컴파일러 또는 최적화 케이스는 얕은 데이터에 액세스하는 깊이 중첩된 루틴이 여러 링크를 통과할 필요가 없도록 (직접 포함된 것뿐만 아니라) 각 엔클로징 레벨에 대해 하나의 링크를 저장합니다.이 전략은 종종 "디스플레이"[3]라고 불립니다.
예를 들어 인수와 반환값을 통해서만 통신하는 순수 함수의 경우와 같이 내부 함수가 캡슐화 내의 어떤(비정수) 로컬데이터에도 액세스하지 않는 경우 접근링크를 최적화할 수 있습니다.Burroughs 대형 시스템과 같은 일부 역사 컴퓨터에는 중첩된 기능을 지원하는 특별한 "디스플레이 레지스터"가 있는 반면, 대부분의 최신 컴퓨터(유비쿼터스 x86 등)용 컴파일러는 필요에 따라 스택에 몇 개의 단어를 남겨두기만 하면 됩니다.
오버랩
어떤 목적에서는 서브루틴의 스택프레임과 그 발신자의 스택프레임은 중복되는 것으로 간주할 수 있습니다.이 오버랩은 파라미터가 발신자에서 착신자에게 전달되는 영역으로 구성됩니다.환경에 따라서는, 발신자는 각 인수를 스택에 푸시 해, 스택프레임을 확장해, 착신자를 호출합니다.다른 환경에서는 발신자가 호출하는 다른 서브루틴에 공급하는 인수를 유지하기 위해 스택프레임의 맨 위에 미리 할당된 영역이 있습니다.이 영역은 outgoing arguments 영역 또는 callout 영역으로 불리기도 합니다.이 접근법에 따라 영역의 크기는 서브루틴이라고 불리는 모든 서브루틴에 필요한 가장 큰 크기로 컴파일러에 의해 계산됩니다.
사용하다
콜 사이트 처리
통상 서브루틴에 대한 콜사이트에서 필요한 콜스택 조작은 최소한입니다(콜하는 서브루틴마다 다수의 콜사이트가 존재할 수 있기 때문에 좋습니다).실제 인수의 값은 특정 콜에 고유하기 때문에 콜사이트에서 평가되며 사용되는 콜규칙에 따라 스택에 푸시되거나 레지스터에 배치됩니다.그 후, 「브런치 및 링크」등의 실제의 콜 명령은, 통상은 타겟 서브루틴의 코드로 제어를 전송하기 위해서 실행됩니다.
서브루틴 입력 처리
호출된 서브루틴에서 실행되는 첫 번째 코드는 통상 서브루틴 프롤로그라고 불리는데, 이는 루틴의 스테이트먼트를 위한 코드가 시작되기 전에 필요한 하우스키핑을 하기 때문이다.
서브루틴 호출에 사용되는 명령이 리턴 주소를 스택에 푸시하지 않고 레지스터에 넣는 명령 집합 아키텍처에서는 일반적으로 프롤로그는 값을 콜스택에 푸시함으로써 리턴 주소를 저장합니다.다만, 착신 서브루틴이 다른 루틴을 호출하지 않는 경우, 값은 그대로 둘 수 있습니다.레지스터.마찬가지로 현재 스택 포인터 및/또는 프레임 포인터 값을 푸시할 수 있습니다.
프레임 포인터가 사용되고 있는 경우, 일반적으로 프롤로그는 스택포인터에서 프레임포인터 레지스터의 새로운 값을 설정합니다.다음으로 스택 포인터를 증분 변경함으로써 로컬 변수용 스택 공간을 할당할 수 있습니다.
Fourth 프로그래밍 언어를 사용하면 콜스택(여기서 「리턴 스택」이라고 부릅니다)을 명시적으로 와인딩할 수 있습니다.
반품 처리
서브루틴은 반환 준비가 되면 프롤로그 스텝을 취소하는 에필로그를 실행합니다.이렇게 하면 일반적으로 스택프레임에서 저장된 레지스터 값(프레임포인터 값 등)이 복원되고 스택포인터 값을 변경하여 스택프레임 전체가 스택에서 팝되며 마지막으로 반환 주소의 명령으로 분기됩니다.많은 호출 규칙에서 에필로그에 의해 스택에서 드롭된 항목은 원래 인수 값을 포함합니다.이 경우 보통 발신자가 실행할 필요가 있는 스택 조작은 없습니다.그러나 일부 호출 규칙에서는 반환 후 인수를 스택에서 삭제하는 것은 발신자의 책임입니다.
풀림
호출된 함수에서 돌아오면 상위 프레임이 스택에서 팝되고 반환 값이 남을 수 있습니다.프로그램의 다른 곳에서 실행을 재개하기 위해 하나 이상의 프레임을 스택에서 꺼내는 보다 일반적인 동작을 스택 언바인딩이라고 하며 예외 처리에 사용되는 것과 같은 비 로컬 제어 구조를 사용할 때 수행해야 합니다.이 경우 함수의 스택프레임에는 예외 핸들러를 지정하는1개 이상의 엔트리가 포함됩니다.예외가 느려지면 느려진 예외 유형을 처리(캐치)할 준비가 된 핸들러가 발견될 때까지 스택이 해제됩니다.
일부 언어에는 일반적인 풀림이 필요한 다른 제어 구조가 있습니다.Pascal은 글로벌 goto 문을 사용하여 중첩된 함수에서 이전에 호출된 외부 함수로 제어를 이전할 수 있습니다.이 조작에서는 스택을 언와인드하고 적절한 컨텍스트를 복원하기 위해 필요한 만큼의 스택프레임을 삭제하여 외부함수 내의 타겟스테이트먼트에 제어를 전송해야 합니다.마찬가지로 C에는 로컬 이외의 gotos로서 기능하는및 함수가 있습니다.Common Lisp를 사용하면 스택이 언와인드 되었을 때의 동작을 제어할 수 있습니다.unwind-protect
특수 오퍼레이터
계속을 적용할 때 스택은 (논리적으로) 언와인된 후 계속 스택과 함께 리와인드됩니다.이는 연속성을 구현하는 유일한 방법은 아닙니다. 예를 들어, 여러 개의 명시적 스택을 사용하여 연속성을 적용하면 스택을 활성화하고 전달되는 값을 감을 수 있습니다.Scheme 프로그래밍 언어를 사용하면 연속성이 호출될 때 컨트롤 스택의 "unwinding" 또는 "rewinding" 시 지정된 포인트에서 임의 탠크를 실행할 수 있습니다.
검사
콜 스택은 프로그램 실행 중에 검사될 수 있습니다.프로그램의 기입 방법과 컴파일 방법에 따라서는 스택 상의 정보를 사용하여 중간값과 함수콜 트레이스를 결정할 수 있습니다.이것은 정밀 자동 테스트를 [4]생성하는 데 사용되며, Ruby나 Smalltalk와 같은 경우에는 1등급 연속 테스트를 구현하는 데 사용됩니다.예를 들어 GNU 디버거(GDB)는 실행 중이지만 일시 정지된 C 프로그램의 [5]콜스택에 대한 인터랙티브인스펙션을 실장합니다.
콜 스택의 정기적인 샘플 수집은 프로그램의 퍼포먼스 프로파일링에 도움이 됩니다.이는 서브루틴의 포인터가 콜스택 샘플링 데이터에 여러 번 표시되는 경우 코드 보틀 넥일 가능성이 높기 때문에 퍼포먼스 문제가 없는지 검사해야 하기 때문입니다.
보안.
프리 포인터 또는 체크되지 않은 배열 쓰기가 있는 언어(C 등)에서는 콜 스택 내의 코드 실행에 영향을 주는 제어 흐름 데이터(리턴 주소 또는 저장된 프레임 포인터)와 단순한 프로그램 데이터(파라미터 또는 리턴 값)의 혼합은 보안 리스크로 스택버퍼 오버플로우를 통해 최대한 악용될 수 있습니다.일반적인 유형의 버퍼 오버플로우입니다.
이러한 공격 중 하나는 1개의 버퍼에 임의의 실행 가능 코드를 채운 후 동일 버퍼 또는 다른 버퍼를 오버플로하여 실행 가능 코드를 직접 가리키는 값으로 반환 주소를 덮어쓰는 것입니다.그 결과 함수가 돌아오면 컴퓨터는 그 코드를 실행합니다.이러한 종류의 공격은 W^[citation needed]X로 쉽게 차단할 수 있습니다.Libc 복귀 공격이나 복귀 지향 프로그래밍으로부터의 공격 등, W^X 보호가 유효하게 되어 있는 경우에서도, 같은 공격이 성공할 수 있습니다.Fourth 프로그래밍 [6]언어에서와 마찬가지로 어레이를 리턴 스택과는 완전히 다른 위치에 저장하는 등 다양한 완화 방법이 제안되었습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Krzyzanowski, Paul (February 16, 2018). "Stack frames". Rutgers University. Archived from the original on 2021-08-28. Retrieved December 19, 2021.
- ^ "Understanding the Stack". cs.umd.edu. 2003-06-22. Archived from the original on 2013-02-25. Retrieved 2014-05-21.
- ^ 대체 마이크로프로세서 설계
- ^ McMaster, S.; Memon, A. (2006). Call Stack Coverage for GUI Test-Suite Reduction (PDF). 17th International Symposium on Software Reliability Engineering (ISSRE '06). pp. 33–44. CiteSeerX 10.1.1.88.873. doi:10.1109/ISSRE.2006.19. ISBN 0-7695-2684-5.
- ^ "Debugging with GDB: Examining the Stack". chemie.fu-berlin.de. 1997-10-17. Retrieved 2014-12-16.
- ^ 더그 호이트."제4 프로그래밍 언어 - 배워야 하는 이유"
추가 정보
- Dijkstra, E. W. (1960). "Recursive Programming". Numerische Mathematik. 2 (1): 312–318. doi:10.1007/BF01386232.
- Wilson, P. R.; Johnstone, M. S.; Neely, M.; Boles, D. (1995). "Dynamic storage allocation: A survey and critical review". Memory Management. Lecture Notes in Computer Science. Vol. 986. pp. 1–116. CiteSeerX 10.1.1.47.275. doi:10.1007/3-540-60368-9_19. ISBN 978-3-540-60368-9.
- "2.4. 그 스택".MCS-4 국회 언어 프로그래밍 매뉴얼-INTELLEC 4마이크로 컴퓨터 시스템 프로그래밍 매뉴얼(예비 교육.)(PDF).산타 클라라, 캘리포니아, 미국:인텔.1973년 12월.를 대신하여 서명함. 2-7–2-8.MCS-030-1273-1.그 2020-03-01에 원래에서Archived(PDF)..(NB다. 인텔의4-bit 프로세서 4004를 구현하는 내부 스택보다는 메모리 내다.)2020-03-02 Retrieved.