CPU หมายถึงสแต็กสนับสนุนอะไร


11

CPU จะไม่รองรับสแต็กได้อย่างไร สถาปัตยกรรมใด ๆ ที่ใช้รูทีนย่อย (ฉันค่อนข้างแน่ใจว่าเป็นสถาปัตยกรรมทั้งหมด) ต้องผลักที่อยู่ผู้ส่งกลับไปยังสแต็กเพื่อให้สามารถกลับไปยังที่ที่เรียกว่ารูทีนย่อยได้ สแต็คหมายถึงส่วนของหน่วยความจำที่มีตัวชี้ที่เติบโตในทิศทางที่แน่นอนและทำหน้าที่เป็นโครงสร้างข้อมูลสแต็กไม่ใช่หรือ? ฉันแค่ไม่เข้าใจว่าสถาปัตยกรรมไม่สามารถรองรับสแต็กได้อย่างไร

หน่วยเก็บข้อมูลหน่วยความจำอัตโนมัติ (ตัวแปรอัตโนมัติเทียบกับตัวแปรคงที่) กำหนดโดยคอมไพเลอร์กับสถาปัตยกรรมฮาร์ดแวร์อย่างไร

คำตอบ:


8

มีไมโครคอนโทรลเลอร์ระดับต่ำจำนวนมากที่มีสแต็คฮาร์ดแวร์สำหรับการเรียก / ส่งคืนและการจัดการขัดจังหวะรูทีนย่อย แต่ทำให้ยากหากไม่สามารถจัดเก็บข้อมูล (ตัวแปร) ที่นั่นและการใช้สแต็กซอฟต์แวร์ข้อมูลล้วนไม่มีประสิทธิภาพมาก 8051 เป็นตัวอย่างคลาสสิกและ PIC ต่ำสุด (PIC12 / PIC16) เป็นอีกตัวอย่างหนึ่ง บนเครื่องเหล่านี้สแต็กข้อมูลถูกจำลองโดยการกำหนดตำแหน่งหน่วยเก็บข้อมูลแบบสแตติกสำหรับตัวแปรอัตโนมัติโดยจำนวนของตำแหน่งเหล่านี้จะขึ้นอยู่กับความซับซ้อนของคอมไพเลอร์

โปรดทราบว่าหากการจำลองแบบสแต็กกำลังดำเนินการในลักษณะนี้หมายความว่าการเรียกซ้ำ - ฟังก์ชันที่เรียกตัวเองไม่ว่าโดยตรงหรือโดยอ้อม - ใช้งานไม่ได้เนื่องจากแต่ละอินสแตนซ์ของฟังก์ชั่นใช้ตำแหน่งคงที่เดียวกันสำหรับตัวแปร "ส่วนตัว" คอมไพเลอร์บางตัวอนุญาตให้ จำกัด การใช้การเรียกซ้ำ (โดยทั่วไปจะใช้งานโดยใช้การ#pragmaเรียงลำดับบางอย่าง) ซึ่งจะทำให้มันสร้างสแต็กข้อมูลจริงไม่ว่าจะช้าลงเท่าใด

นอกเหนือจากนี้แล้วยังมีสถาปัตยกรรมซีพียูที่ไม่ได้มีฮาร์ดแวร์สแต็คเลยแม้แต่การจัดการรูทีนย่อย / ขัดจังหวะรวมถึง DEC PDP-8 และ IBM System / 360 บนเครื่องเหล่านี้พีซี (ที่อยู่ผู้ส่ง) และการลงทะเบียนสถานะ (สำหรับการขัดจังหวะ) ได้รับการบันทึกไว้ในการลงทะเบียนหรือที่ตั้งหน่วยความจำ แต่ในทุกครั้งที่ฉันนึกออกเครื่องยังมีโหมดที่อยู่ที่ยืดหยุ่นได้อย่างเพียงพอ ด้วยซอฟต์แวร์


1
คอมพิวเตอร์ก่อนหน้านี้บางคนจะเขียนคำสั่งการกระโดดลงในโค้ดเพื่อทำให้เกิดการส่งคืน - ไม่มีการข้ามทางอ้อม - ทำให้ฟังก์ชั่น reentrant ทำไม่ได้ (ในทางทฤษฎีสามารถแยกการกระโดดข้ามได้แต่ทว่าเป็นการเพิ่มความซับซ้อนในบางกรณีโดยเฉพาะอย่างยิ่ง ในคำแนะนำ)
Paul A. Clayton

4

"รองรับสแต็ก" หมายถึง

  1. มีการลงทะเบียนตัวชี้สแต็กอย่างชัดเจนและ
  2. มีคำสั่งรหัสเครื่องจักรพื้นฐานสำหรับการจัดการ / ใช้การลงทะเบียนกองซ้อน (เช่น reti ซึ่งเปลี่ยนเคาน์เตอร์โปรแกรมตามตัวชี้กองซ้อนเพื่อกลับจากการเรียกใช้ฟังก์ชัน)

คุณสามารถเลียนแบบสิ่งนี้ได้โดยไม่ต้องสนับสนุนฮาร์ดแวร์ผ่านการจำลองซึ่งเป็นโค้ดที่คอมไพเลอร์สร้างขึ้นซึ่งเป็นประเภทเดียวกันใน RAM โดยใช้ตัวแปร มันหายาก / ผิดปกติที่จะไม่ได้รับการสนับสนุนโดยตรงสำหรับสแต็คในสถาปัตยกรรมคอมพิวเตอร์ที่ทันสมัย

ความหมายของตัวแปรในภาษาการเขียนโปรแกรมแทบไม่มีอะไรเกี่ยวข้องกับสถาปัตยกรรมฮาร์ดแวร์เป้าหมายสำหรับภาษาใด ๆ ที่สูงกว่าการประกอบแบบตรง งานคอมไพเลอร์คือการสร้างรหัสเครื่องที่สอดคล้องกับสัญญาความหมายของภาษาการเขียนโปรแกรม


1
RISC ISAs ส่วนใหญ่ (เช่น MIPS [ไม่รวม MIPS16 และ microMIPS], Alpha, SPARC, PA-RISC, Power, SuperH) ไม่ได้มีการลงทะเบียนตัวชี้สแต็กอย่างชัดเจนซึ่งกำหนดไว้ใน ABI แทน ARM เป็นข้อยกเว้น (บางส่วนเนื่องจากเงา SP สำหรับโหมดการทำงานหลายโหมด) เช่นเดียวกับ MIP16 และ microMIPS (สำหรับความหนาแน่นของรหัส)
Paul A. Clayton

2

สถาปัตยกรรมบางอย่าง (เช่น PIC) มีสแต็กฮาร์ดแวร์ที่ จำกัด ในความสามารถ (สามารถใช้สำหรับที่อยู่ผู้ส่งไม่ใช่ตัวแปร) สถาปัตยกรรมที่มีขนาดเล็กมากบางแห่งไม่มีคำสั่งซื้อและเพิ่มหรือ PUSH ดังนั้นจึงเป็นการเล่นแร่แปรธาตุมากขึ้น

ตัวแปร 'auto' ใน C ควรจะถูกคอมไพล์กับบางสิ่งที่มีพฤติกรรมเริ่มต้น 'auto' และ 'static' กับพฤติกรรมแบบสแตติก ในสถาปัตยกรรมบางอย่างคุณไม่ได้รับอนุญาตให้ทำการเรียกซ้ำซึ่งในกรณีนี้คอมไพเลอร์สามารถจัดสรรตัวแปรทั้งหมดแบบคงที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.