Giải thích con trỏ khung


28

Trong lắp ráp MIPS , có một thanh ghi cho con trỏ ngăn xếp và một thanh ghi khác cho con trỏ khung. Con trỏ khung là gì và mục đích của nó là gì? Nó khác với con trỏ ngăn xếp như thế nào?


1
Nghiên cứu nào bạn đã thực hiện - và sự quen thuộc của bạn với các điều khoản là gì? Hệ thống này dùng để làm gì (các hệ thống khác nhau có thuật ngữ khác nhau)?

Tôi chỉ muốn làm quen với con trỏ khung (lắp ráp mips). Tôi không hiểu làm thế nào nó giúp, tại sao chúng ta cần nó? Cảm ơn nhiều
qwaserdftyghuijkiii

Câu trả lời:


44

Trong lắp ráp MIPS, con trỏ ngăn xếp chỉ vào đỉnh của ngăn xếp. Khi bạn phân bổ không gian trên ngăn xếp, con trỏ ngăn xếp ($ sp) di chuyển để trỏ đến bộ nhớ trống.

Khi gọi một chương trình con trong tập hợp MIPS (các thanh ghi ở mức cao hơn trong những ngày đó - đăng ký các tham số dựa trên sự khác thường), người ta ghi các tham số vào ngăn xếp và sau đó tiến lên con trỏ ngăn xếp.

Khi phương thức bắt đầu, một tham số có thể ở mức bù 16($sp). Tuy nhiên, khi các biến được đặt trên ngăn xếp, con trỏ ngăn xếp di chuyển và tham số tương tự bây giờ có thể được đặt tại 24($sp). Điều này có thể làm cho mã hơi khó hiểu.

Con trỏ khung ($ fp) trỏ đến điểm bắt đầu của khung ngăn xếp và không di chuyển trong suốt thời gian của lệnh gọi chương trình con. Điều này trỏ đến cơ sở của khung ngăn xếp và các tham số được truyền vào chương trình con vẫn ở một điểm không đổi so với con trỏ khung.

Nhận ra rằng con trỏ khung sẽ cần được lưu trữ và khôi phục bằng các lệnh gọi chương trình con sửa đổi nó.

Đọc thêm:


Tôi không biết ý nghĩa của "các thanh ghi có giá cao trong những ngày đó - các tham số dựa trên đăng ký không theo quy tắc" nhưng các tham số cũng có thể được đặt trên ngăn xếp khi số lượng thanh ghi bị giới hạn. Nếu bạn có 35 tham số chẳng hạn (tôi tin rằng MIPS có 32 regs.) Thì bạn sẽ cần đặt 3 tham số cuối cùng vào ngăn xếp Cũng cụ thể hơn để thực hiện, FP sẽ ở địa chỉ trong bộ nhớ có địa chỉ trả về.
Jonathan

1
@Jonathan MIPS Trong số 32 thanh ghi đó, $ 0 là 0. $ tại được bảo lưu, $ v0 và $ v1 là giá trị trả về của các lệnh gọi hàm, $ a0 - $ a3 là các tham số chức năng, $ t0 - $ t9 là tạm thời (bảo toàn người gọi) , $ s0 - $ s7 đã được lưu và $ gp, $ sp, $ fp và $ ra được sử dụng bởi chính hệ thống. Nói chung, chỉ có 24 thanh ghi mục đích chung và một số trong số đó phát sinh nếu bạn muốn sử dụng. Bạn thường chỉ sử dụng các thanh ghi $ t (10). So sánh điều này với Itanium có 128 thanh ghi. Gọi một hàm trong MIPS với 35 tham số, bạn có thể sẽ đặt tất cả chúng vào ngăn xếp.

@Jonathan Tôi cũng sẽ chỉ ra nhận xét này : "AMD Bulldozer: 96 GPR vật lý, Intel Sandy Bridge: 160 GPR vật lý, Intel Haswell: 168 GPR vật lý". Mọi thứ trở nên buồn cười với nhiều máy lõi. SPARC đã có 160 thanh ghi . Tôi cũng chỉ cho bạn đăng ký cửa sổ đi vào một số triết lý thiết kế của MIPS với số lượng đăng ký bằng một nửa so với những người cùng thời.

Vì vậy, đây có giống như cách sử dụng thông thường của thanh ghi %ebp'con trỏ cơ sở' trong quy ước gọi x86 không? (Tôi chưa quen với tất cả những điều này, nhưng nghe có vẻ giống như điều cơ bản giống như sử dụng sth như thế MOV 8(%ebp), %eaxhay sao?)
ELLIOTTCABLE

Dòng Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.này không hoàn toàn rõ ràng điều đó có nghĩa là gì
zadane
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.