Hành vi của ngăn xếp (lớn lên hoặc phát triển xuống) phụ thuộc vào giao diện nhị phân ứng dụng (ABI) và cách ngăn xếp cuộc gọi (hay còn gọi là bản ghi kích hoạt) được tổ chức.
Trong suốt vòng đời của nó, một chương trình bị ràng buộc phải giao tiếp với các chương trình khác như OS. ABI xác định cách một chương trình có thể giao tiếp với một chương trình khác.
Ngăn xếp cho các kiến trúc khác nhau có thể phát triển theo một trong hai cách, nhưng đối với một kiến trúc thì nó sẽ nhất quán. Vui lòng kiểm tra liên kết wiki này . Tuy nhiên, sự tăng trưởng của ngăn xếp được quyết định bởi ABI của kiến trúc đó.
Ví dụ: nếu bạn lấy MIPS ABI, ngăn xếp cuộc gọi được xác định như bên dưới.
Chúng ta hãy xem xét rằng hàm 'fn1' gọi 'fn2'. Bây giờ khung ngăn xếp được nhìn thấy bởi 'fn2' như sau:
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 |
| +---------------------------------+ <-- 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) |
+---------------------------------+
| Arguments to functions called |
| by fn2 |
+---------------------------------+ <- Current SP after stack
frame is allocated
Bây giờ bạn có thể thấy ngăn xếp tăng dần xuống. Vì vậy, nếu các biến được phân bổ cho khung cục bộ của hàm, thì địa chỉ của biến sẽ thực sự tăng xuống. Trình biên dịch có thể quyết định thứ tự của các biến để cấp phát bộ nhớ. (Trong trường hợp của bạn, nó có thể là 'q' hoặc 's' là bộ nhớ ngăn xếp được cấp phát đầu tiên. Nhưng, nói chung trình biên dịch thực hiện cấp phát bộ nhớ ngăn xếp theo thứ tự khai báo của các biến).
Nhưng trong trường hợp mảng, việc cấp phát chỉ có một con trỏ duy nhất và bộ nhớ cần cấp phát sẽ thực sự được trỏ bởi một con trỏ duy nhất. Bộ nhớ cần phải liền kề cho một mảng. Vì vậy, mặc dù ngăn xếp tăng dần xuống, đối với các mảng thì ngăn xếp tăng lên.