2012-03-03 66 views
11

Tôi đang gặp sự cố khi hiểu cách hướng dẫn jal hoạt động trong bộ xử lý MIPS. hai câu hỏi của tôi là:
a) gì là giá trị được lưu trữ trong R31 sau "jal": PC + 4 hoặc PC + 8?
b) Nếu nó thực sự là PC + 8, điều gì xảy ra với hướng dẫn tại PC + 4? Nó được thực hiện trước khi nhảy hoặc nó không bao giờ được thực hiện?

Trong Patterson và Hennessy (ấn bản thứ tư), pg 113:

"nhảy-và-link hướng dẫn: Một hướng dẫn mà nhảy đến và địa chỉ, đồng thời tiết kiệm các địa chỉ của lệnh sau đây trong một thanh ghi ($ ra trong MIPS)"

'chương trình truy cập (PC): Thanh ghi chứa địa chỉ của lệnh trong chương trình được thực thi'

Sau khi đọc hai câu, nó sau đó các giá trị sa ved in $ ra phải là (PC + 4).

Tuy nhiên, trong các dữ liệu tham khảo MIPS (thẻ xanh) mà đi kèm với cuốn sách, thuật toán hướng dẫn jal được định nghĩa như thế này:
"Jump và Link: jal: J: R [31] = PC + 8 ; PC = JumpAddr "

website này cũng khẳng định rằng 'nó thực sự PC + 8', nhưng kỳ lạ, sau đó nó nói rằng kể từ khi pipelining là một chủ đề cao cấp" chúng tôi sẽ đảm nhận địa chỉ trả lại là PC +4 ".
Tôi đến từ 8086 lắp ráp, vì vậy tôi biết rằng có sự khác biệt lớn giữa việc quay lại địa chỉ và địa chỉ sau, bởi vì chương trình sẽ không hoạt động nếu tôi giả định điều gì đó không đúng. Cảm ơn.

Trả lời

12

Địa chỉ trong $ ra thực sự là PC + 8. Lệnh ngay sau lệnh jal nằm trong "branch delay slot". Nó được thực thi trước khi hàm được nhập vào, vì vậy nó không nên được thực hiện lại khi hàm trả về.

Hướng dẫn phân nhánh khác trên Mips cũng có các khe trễ chi nhánh.

Khe trễ được sử dụng để thực hiện điều gì đó hữu ích trong thời gian thực hiện lệnh jal.

+0

Cảm ơn rất nhiều! Kỳ lạ thay, nhiều trang web trình bày thông tin sai (PC + 4). – ReimannCL

1

Tôi có cùng một câu hỏi. Googled câu trả lời tuyệt vời này của Richard và cũng là một liên kết tôi muốn thêm ở đây.

Liên kết là http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html với lời giải thích tuyệt vời này về cách thêm 4 vào PC. Vì vậy, việc thực thi thực tế có hai bổ sung: 1) newPC = PC + 4 bằng pipelining và 2) một bổ sung $ ra = newPC + 4 bởi lệnh jal dẫn đến hiệu quả $ ra = (địa chỉ của lệnh jal) +8.