주문 매개 변수와 스택 / 힙 성장 순서를 밀어

먼저, 독립적 인 스택 및 운영 체제의 성장 방향은, 더 CPU에 의해 결정되고, 두번째로, 스택과 힙의 성장 방향은 정반대이다. 왜 스택의 성장 방향과 힙은 그 반대가 될 것인가? : 링크 말을 참조하십시오 https://www.quora.com/What-is-the-logical-explanation-for-stacks-typically-growing-downward-and-heaps-growing-upward?awc=15748_1571029880_d4826064801376537778f6a4f6f88d15&uiv=6&txtv= 8 = awin 소스 및 매체 = 광고 캠페인 및 = uad_mkt_en_acq_us_awin 및 설정 = & pub_id를 awin = 85,386

모든 섹션에 의해 공유 된 고정 된 선형 주소 공간을 가정한다. 힙과 스택 부분의 크기를 동적으로하면서 텍스트 및 데이터 섹션은 고정 된 크기이다.

당신이 포장 문제로이 생각한다면, 당신은 가장 낮은 메모리 위치에 텍스트 및 데이터 중 하나를 배치하여 섹션의 최적의 포장을 달성하거나 높은 메모리 위치에서 다음 힙 및 스택 섹션 나머지 사용하여 서로를 향해 확장 필요에 의해 기억. 원칙적으로, 이는 다른 낮은 메모리 어드레스를 향해 팽창하는 동안 그들 중 하나가 더 높은 메모리 어드레스를 향해 확장을 의미한다.

당신은 대답 할 때 우리가 역사적 사실을 피할 것을 요청했다. 역사적 사실이없는 경우 : 그것은 어느 쪽이든을 할 수있다; 스택은 자랄 수, 또는 아래로 성장할 수; 힙이 자랄 수, 또는 아래로 성장할 수 있습니다.

스택은 모두 제어 및 데이터 기능을 가지며, 따라서 데이터 부에 인접하는 더미 구역을 배치하는 약한 인수 및 메모리의 타단 스택 부 거기하면서 논리적으로하지만, 힙 데이터의 확장이다.

이제 규칙을 깰 ....
이 스위치 패널 하드웨어 부트 스트래핑 메커니즘, 카드 판독기에 의해 지원되었다 (때로는 인터럽트 / 트랩 벡터 포함), 어드레스 0000에서 시작하여 증가하는 어드레스로 코드와 데이터를 순차적으로 로딩 많은 초기 프로세서 또는 종이 테이프. 이 메모리 부족에 텍스트와 데이터 섹션을 배치.
많은 초기 프로세서는 서브 루틴 호출, 매개 변수와 지역 변수가 아닌 하드웨어 힙에 대한 예 하드웨어 스택을했다. CPU는 디자이너 스택이 증가 할 방향 선택을했고, 그것이 될 수있는 방법 큰 (예를 들어, 6502 마이크로 프로세서는 스택의 256 바이트를했다).
메모리를 참조 할 때 많은 초기 프로세서는베이스 레지스터 만 부호 오프셋을 허용하고, 그래서, 어드레스 계산은 상대적 스택 포인터는 스택 하향 성장하는 경우보다 효율적이었다.

 

다음으로, 상기 프로세서의 각각에 대응하는 스택의 성장 방향이 요약되어 https://stackoverflow.com/questions/664744/what-is-the-direction-of-stack-growth-in-most-modern-systems

프로세서와 그 방향은 다음과 같습니다 :

  • 86 : 아래로.
  • SPARC : 선택. 표준 ABI는 아래로 사용합니다.
  • PPC : 아래로, 나는 생각한다.
  • System z의 : 링크 된 목록에서, 나는 아이가 당신이하지 (하지만 여전히 아래로, 적어도 zLinux의 경우).
  • ARM : 선택,하지만 Thumb2는 아래 컴팩트 인코딩 (후 LDMIA = 증가, 전 STMDB = 감소)가 있습니다.
  • 6502 : 아래 (만 256 바이트).
  • RCA (1802A) : SCRT 구현에 따라 원하는 방식.
  • PDP11 : 아래로.
  • 8051 : 최대.

일반적인 CPU 스택이 아래로 성장하고 있습니다, 다른 8051, 그것은 스택은 깁니다.

함수가 호출 될 때, 변수는 밀어하는 방법은? MIPS는 아래의 예와 같은 스택을 성장 : https://stackoverflow.com/questions/1677415/does-stack-grow-upward-or-downward

우리가 그 기능 '을 Fn1'호출 'Fn2를'을 생각해 보자. 이제 다음과 같이 'Fn2를'에서 볼 수 있듯이 스택 프레임은 다음과 같습니다

direction of     |                                 |
  growth of      +---------------------------------+ 
   stack         | Parameters passed by fn1(caller)|
from higher addr.|                                 |
to lower addr.   | Direction of growth is opposite |
      |          |   to direction of stack growth  |  // 注1
      |          +---------------------------------+ <-- SP on entry to fn2|          |                                 |
      |          | Return address from fn2(callee) | 
      V          +---------------------------------+ 
                 | Callee saved registers being    | 
                 |   used in the callee function   | 
                 +---------------------------------+
                 | Local variables of fn2          |
                 |(Direction of growth of frame is |
                 | same as direction of growth of  |
                 |            stack)               |  // 注2
                 +---------------------------------+ 
                 | Arguments to functions called   |
                 | by fn2                          |
                 +---------------------------------+ <- Current SP after stack frame is allocated
 
注1/注2:direction of growth is oppsite to/same as direction of stack growth。direction of stack growth应理解为,既然栈是向下往低地址一侧生长,即先出现的变量的地址应该更高。与栈生长方向相反,应理解为,先出现的变量占据低位地址。
主调函数传递的参数,在栈内生长方向与栈生长方向相反,即后出现的参数先入栈。
这是为了实现可变长参数的函数。
这样一来,以下例子及其结果就容易理解了:

#INCLUDE <STDIO.H>

보이드 FUNC (INT fmt_1, INT fmt_2)
{
    INT local_var_1;
    INT local_var_2;

    의 printf ( "ADDR fmt_1의 % P \ 없음", fmt_1);
    의 printf ( "ADDR fmt_2의 % P \ 없음", fmt_2);
    의 printf ( "ADDR local_var_1의 % P \ 없음", local_var_1);
    의 printf ( "ADDR local_var_2의 % P \ 없음", local_var_2);
}

메인 INT (무효)
{
    INT의 main_var_1;
    INT의 main_var_2;

    의 printf ( "ADDR main_var_1의 % P \ 없음", main_var_1);
    의 printf ( "ADDR main_var_2의 % P \ 없음", main_var_2);

    FUNC (1, 2);
}

결과 :

영상

1) 성장을 스택;

2) 동일한 적층 성장 방향의 적층 순서 상 자동 변수, 즉, 변수는 main_var_2의 어드레스 main_var_1 어드레스보다 높은 고차 어드레스 설명하기 위해 나타난다.

적층 성장 방향 매개 변수 3)의 적층 순서를 달리 주요 통화 FUNC는 전달 즉, 좌우 파라미터 스택에서, 즉 변수의 첫번째 발생의 하위 어드레스는 어드레스보다 높은 fmt_2 fmt_1 주소 인 경우.

추천

출처www.cnblogs.com/freshair_cnblog/p/11671416.html