2012-02-28 3 views
2

값을 스택으로 푸시하면 ESP 레지스터가 감소하고 (증가하는 것과 반대), 값을 팝하면 ESP 레지스터가 증가합니다 (감소한 것과 반대) ? 이것은 현재 나에게 직관적이지 않습니다.ASM - 푸시/팝

+1

두어 번으로 * 성장한 스택을 가지고 작업해야했지만, * 그 *는 매우 직관적이었습니다. :) – harold

답변

6

스택이 위에서 아래로 "자라기"때문에 스택이 아래쪽으로 할당 된 힙에 반대합니다.

주소 공간이 제한적인 아키텍처에서 이것은 설계상의 결정 이었으므로 둘 다 더 유연하게 사용할 수 있습니다. 할당 된 두 메모리 영역의 합이 특정 제한을 초과하면 안됩니다.

요즘 스택 및 힙 주소 공간은 별도의 메모리 영역에 보관되지만 어쨌든 스택은 거꾸로 늘어나기로 결정했습니다.

1

다소 임의적 인 디자인 선택입니다. 스택 포인터는 push에서 증가하고 pop에서 감소 할 경우 똑같이 잘 작동합니다. 일부 언어에서는 텍스트가 왼쪽에서 오른쪽으로 쓰는 대신 오른쪽에서 왼쪽으로 쓰여지며 특정 방향으로 언어가 더 좋거나 나쁘지는 않습니다.

1

단일 메모리 시스템을 그대로 사용하면서 많은 환경에서 여전히 프로그래머가 직면하면 낮은 주소에서 높은 주소로 힙이 커지고 메모리 주소의 위쪽에서 아래쪽으로 스택이 커집니다 주소를 사용하여 충돌없이 해당 메모리 사용을 극대화합니다. 둘 다 자라면 고통스럽고 추악한 방식으로 뛰어 넘을 필요가 있거나 사용 가능한 여유 공간이 있음에도 불구하고 어느 하나가 제한 될 것입니다. 여러 프로세서에서 malloc을 다시 작성하거나 자신 만의 스택을 만들 수 있으며 스택이 자라날 수 있습니다 (일부 명령어 세트는 임의의 방법으로 일부 작업을 수행 할 수 없음). 흐름을 따라 가면서 스택을 자라게하고 힙을 자라게하는 것이 더 좋습니다.