CPU가 스택을 지원한다는 것은 무엇을 의미합니까?


11

CPU는 어떻게 스택을 지원하지 않습니까? 서브 루틴을 사용하는 아키텍쳐 (모든 아키텍쳐라고 확신합니다)는 리턴 주소를 스택으로 푸시하여 서브 루틴을 호출 한 곳으로 돌아갈 수 있습니까? 스택은 특정 방향으로 성장하고 스택 데이터 구조로 작동하는 포인터가있는 메모리 섹션을 의미합니다. 아키텍처가 스택을 지원할 수없는 방법을 이해하지 못합니다.

컴파일러와 하드웨어 아키텍처에 의해 자동 메모리 저장 (자동 변수와 정적 변수)이 어느 정도 결정됩니까?

답변:


8

서브 루틴 호출 / 반환 및 인터럽트 처리를위한 하드웨어 스택이있는 많은 저수준 마이크로 컨트롤러가 있지만 데이터 (변수)를 저장하는 것이 불가능하지는 않지만 어렵게 만들며 순수한 소프트웨어 데이터 스택을 구현하는 것은 대단히 비효율적입니다. 8051은 전형적인 예이며, 저급 PIC (PIC12 / PIC16)는 또 다른 예입니다. 이러한 머신에서 자동 스택에 대한 정적 스토리지 위치를 지정하여 데이터 스택이 에뮬레이트되며,이 위치의 재사용 양은 컴파일러의 정교함에 의존합니다.

스택 에뮬레이션이 이런 식으로 수행되는 경우 함수의 각 인스턴스가 "비공개"변수에 대해 동일한 정적 위치를 재사용하므로 재귀 (직접 또는 간접적으로 호출되는 함수)는 작동하지 않습니다. 일부 컴파일러는 재귀 사용을 제한적으로 허용하며 (일반적으로 #pragma일종의 방법으로 구현 됨 ), 속도 저하에 관계없이 진정한 데이터 스택을 생성합니다.

그 외에도 DEC PDP-8 및 IBM System / 360을 포함하여 서브 루틴 / 인터럽트 처리를위한 하드웨어 스택이 전혀없는 CPU 아키텍처가 있습니다. 이러한 머신에서 PC (반환 주소)와 상태 레지스터 (인터럽트 용)는 레지스터 또는 메모리 위치에 저장되었지만 생각할 수있는 모든 경우에 머신에는 충분히 유연한 주소 모드가있어 스택을 쉽게 만들 수있었습니다. 소프트웨어로.


1
일부 이전 컴퓨터는 코드에 점프 명령을 작성하여 간접 점프가 아닌 리턴을 유발하여 재진입 기능을 비실용적으로 만듭니다 (이론적으로 점프로 분기 될 수 있지만 특히 데이터 주소가 완전히 인코딩 된 경우 복잡성을 증가시킵니다 지침에서).
Paul A. Clayton

4

"스택 지원"은

  1. 명시적인 스택 포인터 레지스터가 있고
  2. 스택 포인터 레지스터를 조작 / 사용하기위한 원시 기계 코드 명령어 (예 : 함수 호출에서 리턴하기 위해 스택 포인터를 기반으로 프로그램 카운터를 변경하는 reti)

에뮬레이션을 통해 하드웨어 지원없이이를 에뮬레이션 할 수 있습니다. 에뮬레이션은 변수를 사용하여 RAM에서 같은 종류의 컴파일러 생성 코드입니다. 현대 컴퓨터 아키텍처에서 스택을 직접 지원하지 않는 경우는 거의 없습니다.

프로그래밍 언어에서 변수의 의미론은 직선 어셈블리보다 높은 언어의 경우 대상 하드웨어 아키텍처와 거의 관련이 없습니다. 컴파일러 작업은 프로그래밍 언어의 시맨틱 계약을 준수하는 기계 코드를 생성하는 것입니다.


1
대부분의 RISC ISA (예 : MIPS [MIPS16 및 microMIPS 제외], Alpha, SPARC, PA-RISC, Power, SuperH)에는 ABI에서이를 정의하는 명시적인 스택 포인터 레지스터가 없습니다. MIP16 및 microMIPS (코드 밀도의 경우)와 같이 ARM은 예외입니다 (부분적으로 여러 운영 모드에서 SP를 가리기 때문에).
Paul A. Clayton

2

일부 아키텍처 (예 : PIC)에는 기능이 제한적인 하드웨어 스택이 있습니다 (변수가 아닌 반환 주소에만 사용할 수 있음). 일부 매우 작은 아키텍처에는 저장 및 증가 또는 PUSH 명령이 없으므로 스택을 수행하는 것이 더 어렵습니다.

C의 'auto'변수는 항상 'auto'초기화 동작을 사용하고 정적 동작을 사용하는 'static'으로 컴파일해야합니다. 일부 아키텍처에서는 재귀를 허용하지 않으며,이 경우 컴파일러는 모든 변수를 정적으로 할당 할 수 있습니다.

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