tăng trưởng stack thường không phụ thuộc vào hệ điều hành riêng của mình, nhưng trên bộ vi xử lý nó đang chạy trên. Solaris, ví dụ, chạy trên x86 và SPARC. Mac OSX (như bạn đã đề cập) chạy trên PPC và x86. Linux chạy trên tất cả mọi thứ từ danh dự lớn của tôi 'Hệ thống z tại nơi làm việc đến puny little wristwatch.
Nếu CPU cung cấp bất kỳ loại lựa chọn nào, quy ước ABI/gọi được hệ điều hành sử dụng chỉ định lựa chọn nào bạn cần thực hiện nếu bạn muốn mã của bạn gọi mã của người khác.
Các bộ vi xử lý và chỉ đạo của họ là:
x86 down
SPARC selectable. The standard ABI uses down.
PPC down, I think.
System z in a linked list, I kid you not.
(but still down, at least for zLinux).
ARM selectable, but Thumb2 has compact encodings only for down (LDMIA (increment after)/STMDB (decrement before))
Mostek6502 down (but only 256 bytes).
RCA1802A any way you want, subject to SCRT implementation.
PDP11 down.
Hiển thị tuổi của tôi trên những vài ngoái, 1802 là chip được sử dụng để kiểm soát các tàu con thoi sớm (cảm nếu những cánh cửa đã được mở, tôi nghi ngờ, dựa trên sức mạnh xử lý nó có :-) và máy tính thứ hai của tôi, COMX-35 (theo số ZX80) của tôi.
Chi tiết PDP11 được lấy từ here.
Kiến trúc SPARC sử dụng mô hình đăng ký cửa sổ trượt. Các chi tiết có thể nhìn thấy về mặt kiến trúc cũng bao gồm một bộ đệm tròn của các cửa sổ đăng ký có giá trị và được lưu trong bộ nhớ cache nội bộ, với các bẫy khi quá/lưu lượng. Xem here để biết chi tiết. Như hướng dẫn the SPARCv8 manual explains, SAVE và RESTORE giống như hướng dẫn ADD cộng với xoay vòng sổ đăng ký. Sử dụng một hằng số dương thay vì tiêu cực thông thường sẽ tạo ra một chồng tăng lên.
Kỹ thuật SCRT nói trên là một kỹ thuật khác - 1802 đã sử dụng một số hoặc 16 đăng ký 16 bit cho SCRT (kỹ thuật gọi và trả lại chuẩn). Một là bộ đếm chương trình, bạn có thể sử dụng bất kỳ thanh ghi nào như PC với lệnh SEP Rn
. Một là con trỏ ngăn xếp và hai được thiết lập luôn luôn trỏ đến địa chỉ mã SCRT, một cho cuộc gọi, một cho trả lại. Không đăng ký được xử lý theo cách đặc biệt. Hãy ghi nhớ những chi tiết này là từ bộ nhớ, chúng có thể không hoàn toàn chính xác. Ví dụ, nếu R3 là PC, R4 là địa chỉ cuộc gọi SCRT, R5 là địa chỉ trả về SCRT và R2 là "stack" (dấu ngoặc kép khi nó được thực hiện trong phần mềm), SEP R4
sẽ đặt R4 là PC và bắt đầu chạy mã cuộc gọi SCRT.
Nó sẽ sau đó cửa hàng R3 trên R2 "ngăn xếp" (Tôi nghĩ R6 đã được sử dụng để lưu trữ tạm thời), điều chỉnh nó lên hoặc xuống, lấy hai byte sau R3, tải chúng vào R3, sau đó làm SEP R3
và đang chạy tại địa chỉ mới.
Để trả lại, nó sẽ SEP R5
sẽ kéo địa chỉ cũ ra khỏi ngăn xếp R2, thêm hai vào nó (để bỏ qua byte địa chỉ của cuộc gọi), tải nó vào R3 và SEP R3
để bắt đầu chạy mã trước đó.
Rất khó khăn để quấn đầu của bạn xung quanh ban đầu sau khi tất cả mã dựa trên ngăn xếp 6502/6809/z80 nhưng vẫn thanh lịch theo kiểu sắp xếp ngang hàng. Ngoài ra một trong những tính năng bán hàng lớn của chip là 16 thanh ghi 16-bit, và bạn ngay lập tức mất 7 trong số đó (5 cho SCRT, hai cho DMA và ngắt từ bộ nhớ). Ahh, chiến thắng của tiếp thị trên thực tế.
Hệ thống z thực sự khá giống nhau, sử dụng thanh ghi R14 và R15 để gọi/trả lại.
Phiên bản hướng xuống dưới: http://stackoverflow.com/questions/2035568/why-do-stacks-typically-grow-downwards –