스택 레지스터
Stack register스택 레지스터는 콜 스택을 추적하는 것을 목적으로 하는 컴퓨터 중앙 프로세서 레지스터입니다.어큐뮬레이터 베이스의 아키텍처 머신에서는, 이것은 인텔 x86 머신상의 SP와 같은 전용 레지스터일 가능성이 있습니다.일반 레지스터 머신에서는 PDP-11 또는 RISC 머신과 같이 관례에 따라 예약된 레지스터일 수 있다.Data General Eclipse와 같은 일부 설계에는 전용 레지스터가 없었지만 이 기능을 위해 예약된 하드웨어 메모리 주소를 사용했습니다.
1960년대 후반 이전의 머신(PDP-8이나 HP 2100 등)에는 재귀를 지원하는 컴파일러가 없었습니다.서브루틴 명령은 일반적으로 점프 주소에 현재 위치를 저장한 후 프로그램 카운터를 [1]다음 주소로 설정합니다.이것은 스택을 유지하는 것보다 간단하지만 서브루틴 코드 섹션당 리턴 로케이션은 1개뿐이기 때문에 프로그래머 측에서 상당한 노력을 기울이지 않고는 재귀가 있을 수 없습니다.
스택 머신에는 2개 이상의 스택레지스터가 있습니다.이 중 하나는 콜스택을 추적하고 다른 하나는 다른 스택을 추적합니다.
x86의 스택 레지스터
8086에서는 메인 스택 레지스터를 스택 포인터 - SP라고 부릅니다.Stack Segment Register(SS; 스택세그먼트 레지스터)는 일반적으로 현재 실행 중인 프로그램의 콜스택을 저장하는 메모리세그먼트에 대한 정보를 저장하기 위해 사용됩니다.SP가 현재 스택 상단을 가리킵니다.디폴트에서는, 스택은 메모리내에서 하향으로 증가하기 때문에, 새로운 값은 보다 낮은 메모리주소에 배치됩니다.값을 스택에 푸시하려면PUSH
명령어가 사용됩니다.스택에서 값을 팝하려면POP
명령어가 사용됩니다.
예:SS = 1000h, SP = 0xF820이라고 가정합니다.즉, 현재의 스택톱은 물리 주소 0x1F820입니다(이는 8086의 메모리세그먼테이션에 의한 것입니다).프로그램의 다음 두 가지 기계 명령은 다음과 같습니다.
밀어넣다 AX 밀어넣다 BX
- 이러한 첫 번째 명령은 AX(16비트 레지스터)에 저장된 값을 스택에 푸시합니다.이것은 SP에서 2(2바이트)의 값을 빼서 실행합니다.
- SP의 새로운 값은 0xF81E가 됩니다.다음으로 CPU는 물리 주소가 0x1F81E인 메모리 워드에 AX 값을 복사합니다.
- "PUSH BX"가 실행되면 SP는 0xF81C로 설정되고 BX는 0x1F81C로 [2]복사됩니다.
이것은 PUSH의 구조를 나타내고 있습니다.일반적으로 실행 중인 프로그램은 레지스터를 스택에 푸시하여 레지스터의 현재 값을 변경할 수 있는 루틴을 호출하는 것과 같은 다른 목적으로 레지스터를 사용합니다.스택에 저장된 값을 복원하려면 프로그램에 다음과 같은 기계 명령이 포함되어야 합니다.
팝 BX 팝 AX
POP BX
는 0x1F81C(BX의 오래된 값)에 있는 워드를 BX에 복사한 후 SP를 2 늘립니다.SP는 0xF81E가 됩니다.POP AX
는 0x1F81E의 워드를 AX에 복사하고 SP를 0xF820으로 [nb 1][nb 2]설정합니다.
스택 엔진
단순한 프로세서는 스택포인터를 일반 하드웨어 레지스터에 저장하고 연산 로직 유닛(ALU)을 사용하여 값을 조작합니다.일반적으로 푸시 및 팝은 여러 마이크로 ops로 변환되어 스택포인터를 개별적으로 추가/삭제하고 메모리에 [3]로드/스토어를 수행합니다.
새로운 프로세서에는 스택 동작을 최적화하기 위한 전용 스택엔진이 탑재되어 있습니다.Pentium M은 스택엔진을 도입한 최초의 x86 프로세서입니다.실장에서는 스택포인터는 2개의 레지스터로 분할됩니다.32비트O 레지스터인ESP와 스택d 조작에 의해 직접 갱신되는8비트 델타값 ESP입니다PUSH, POP, CALL 및 RET opcode는 ESP 레지스터에서d 직접 동작합니다.ESP가 오버플로에 가깝거나 ESP 레지스터가 다른 명령에서 참조된 경우d(ESP가 0일 경우d), ALU를 사용하여 ESP를O 업데이트하고 ESP를 0으로 리셋하는d 동기 마이크로op이 삽입됩니다.ESP는 64비트로 [4]확장되었지만 이 설계는O 최신 인텔 프로세서에서 거의 변경되지 않았습니다.
AMD K8 마이크로아키텍처에는 인텔과 유사한 스택엔진도 채용되었습니다.Buldozer에서는 동기 마이크로 ops의 필요성이 없어졌지만 스택엔진의 내부설계는 알려지지 않았습니다.[4]
메모들
레퍼런스
- ^ 살로몬, 데이비드[1992년](2월 1993년).캘리포니아 주립 대학교 Northridge, 캘리포니아, 미국. Chivers, 이언 D.(교육.)에 쓰여진.Assemblers과 Loaders(PDF).엘리스 Horwood 시리즈 컴퓨터는, 또 그들의 응용 프로그램(1판).Chicester, 웨스트 서식스 주, 영국:엘리스 Horwood 리미티드/사이먼&슈스터 국제 그룹이다.아이 에스비엔 0-13-052564-2.그 2020-03-23에 원래에서Archived(PDF).2008-10-01 Retrieved.대부분의 컴퓨터, 하나를 등록하거나 절차(어떤 경우에 그 절차의 첫 실행 명령이 두번째 단어에 저장되어야 합니다)의 첫번째 단어에 전조등의 스택의 반송 주소를 저축한다.그의 주소가 절차의 첫번째 단어에 들어 있는 메모리 위치에 만약 후자의 경우에 사용됩니다, 절차에서 반환된 건 점프일.(xiv+294+4 페이지)
- ^ Howard, Brian. "Assembly Tutorial - Instructions". Computer Science Department, DePauw University. Retrieved 2013-07-19.
- ^ Stokes, Jon "Hannibal" (2004-02-25). "A Look at Centrino's Core: The Pentium M". archive.arstechnica.com. p. 5.
- ^ a b Fog, Agner. "The microarchitecture of Intel, AMD and VIA CPUs" (PDF). Technical University of Denmark.