CPU hỗ trợ ngăn xếp có nghĩa là gì?


11

Làm thế nào một CPU không thể hỗ trợ một ngăn xếp? Không có kiến ​​trúc nào sử dụng chương trình con (tôi khá chắc chắn rằng tất cả các kiến ​​trúc) phải đẩy địa chỉ trả lại lên ngăn xếp để nó có thể quay lại nơi được gọi là chương trình con? Ngăn xếp chỉ có nghĩa là một phần của bộ nhớ với một con trỏ phát triển theo một hướng nhất định và hoạt động như một cấu trúc dữ liệu ngăn xếp không? Tôi chỉ không hiểu làm thế nào một kiến ​​trúc không thể hỗ trợ một ngăn xếp.

Ở mức độ nào thì lưu trữ bộ nhớ tự động (biến tự động so với biến tĩnh) được xác định bởi trình biên dịch so với kiến ​​trúc phần cứng?

Câu trả lời:


8

Có nhiều bộ vi điều khiển cấp thấp có ngăn xếp phần cứng để gọi / trả lại chương trình con và xử lý ngắt, nhưng gây khó khăn nếu không thể lưu trữ dữ liệu (biến) ở đó và thực hiện ngăn xếp dữ liệu phần mềm thuần túy sẽ không hiệu quả. 8051 là một ví dụ cổ điển và PIC cấp thấp (PIC12 / PIC16) là một ví dụ khác. Trên các máy này, ngăn xếp dữ liệu được mô phỏng bằng cách gán các vị trí lưu trữ tĩnh cho các biến tự động, với số lượng tái sử dụng của các vị trí này phụ thuộc vào độ tinh vi của trình biên dịch.

Lưu ý rằng nếu mô phỏng ngăn xếp được thực hiện theo cách này, điều đó có nghĩa là đệ quy - một hàm tự gọi trực tiếp hoặc gián tiếp - không hoạt động, vì mỗi phiên bản của hàm sử dụng lại các vị trí tĩnh giống nhau cho các biến được cho là "riêng tư" của nó. Một số trình biên dịch cho phép sử dụng đệ quy hạn chế (thường được thực hiện bằng phương tiện #pragmanào đó), điều này sẽ khiến nó tạo ra một ngăn xếp dữ liệu thực sự bất kể nó làm mọi thứ chậm đi bao nhiêu.

Chỉ là một bên, đã có các kiến ​​trúc CPU hoàn toàn không có ngăn xếp phần cứng, thậm chí không xử lý chương trình con / ngắt, bao gồm cả DEC PDP-8 và IBM System / 360. Trên các máy này, PC (địa chỉ trả về) và thanh ghi trạng thái (cho các ngắt) đã được lưu trong các thanh ghi hoặc vị trí bộ nhớ, nhưng trong mọi trường hợp tôi có thể nghĩ, máy cũng có các chế độ địa chỉ đủ linh hoạt để dễ dàng tạo một ngăn xếp với phần mềm.


1
Một số máy tính trước đó sẽ viết một lệnh nhảy vào mã để tạo ra sự quay trở lại - không có các bước nhảy gián tiếp - làm cho các hàm reentrant trở nên không thực tế (về mặt lý thuyết người ta có thể phân nhánh qua một bước nhảy nhưng điều đó làm tăng thêm sự phức tạp, đặc biệt là khi địa chỉ dữ liệu được mã hóa hoàn toàn trong hướng dẫn).
Paul A. Clayton

4

"Hỗ trợ một ngăn xếp" có nghĩa là

  1. có một thanh ghi con trỏ ngăn xếp rõ ràng, và
  2. có các hướng dẫn mã máy nguyên thủy để thao tác / sử dụng thanh ghi con trỏ ngăn xếp (như reti, thay đổi bộ đếm chương trình dựa trên con trỏ ngăn xếp để trả về từ lệnh gọi hàm).

Bạn có thể mô phỏng điều này mà không cần hỗ trợ phần cứng thông qua mô phỏng, đó là mã được trình biên dịch tạo ra cùng loại với RAM bằng các biến. Thật hiếm / không phổ biến khi không có hỗ trợ trực tiếp cho stack trong bất kỳ kiến ​​trúc máy tính hiện đại nào.

Ngữ nghĩa của các biến trong ngôn ngữ lập trình hầu như không liên quan gì đến kiến ​​trúc phần cứng đích, đối với bất kỳ ngôn ngữ nào cao hơn lắp ráp thẳng. Công việc biên dịch là tạo mã máy tuân thủ hợp đồng ngữ nghĩa của ngôn ngữ lập trình.


1
Hầu hết các ISA RISC (ví dụ: MIPS [không bao gồm MIPS16 và microMIPS], Alpha, SPARC, PA-RISC, Power, SuperH) không có thanh ghi con trỏ ngăn xếp rõ ràng, thay vào đó xác định như vậy trong ABI. ARM là một ngoại lệ (một phần vì nó phủ bóng SP cho một số chế độ hoạt động) như MIP16 và microMIPS (đối với mật độ mã).
Paul A. Clayton

2

Một số kiến ​​trúc (ví dụ PIC) có ngăn xếp phần cứng bị giới hạn về khả năng (chỉ có thể được sử dụng cho địa chỉ trả về, không phải biến). Một số kiến ​​trúc cực kỳ nhỏ không có hướng dẫn lưu trữ và tăng hoặc lưu trữ, do đó, việc thực hiện một ngăn xếp sẽ khó khăn hơn.

Các biến 'tự động' trong C phải luôn được biên dịch thành thứ gì đó có hành vi khởi tạo 'tự động' và 'tĩnh' với hành vi tĩnh; trên một số kiến ​​trúc bạn không được phép thực hiện đệ quy, trong trường hợp đó, trình biên dịch có thể phân bổ tĩnh tất cả các biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.