2012-02-13 25 views
23

Tôi đang gặp một số sự cố khi hiểu sự khác biệt giữa người gọi và đăng ký được lưu trữ bằng callee và thời điểm sử dụng những gì.Trình đăng ký được lưu trữ bằng callee và người gọi là gì?

Tôi đang sử dụng MSP430 :

thủ tục:

mov.w #0,R7 
mov.w #0,R6 
add.w R6,R7 
inc.w R6 
cmp.w R12,R6 
jl l$loop 
mov.w R7,R12 
ret 

mã trên là một callee và được sử dụng trong một ví dụ điển hình để nó theo quy ước. R6 và R7 được lưu lại và được gọi là R12. Sự hiểu biết của tôi là regs tiết kiệm callee không phải là "toàn cầu" theo nghĩa là việc thay đổi giá trị của nó trong một quy trình sẽ không ảnh hưởng đến giá trị của nó bên ngoài quy trình. Đây là lý do tại sao bạn phải lưu một giá trị mới vào reg callee lúc đầu.

R12, người gọi được lưu là "chung", vì thiếu từ tốt hơn. Thủ tục nào có tác dụng lâu dài đối với R12 sau cuộc gọi.

Sự hiểu biết của tôi có đúng không? Tôi có thiếu những thứ khác không?

Trả lời

52

Caller-lưu thanh ghi (AKA đăng ký biến động) được sử dụng để giữ số lượng tạm thời mà cần không được duy trì qua các cuộc gọi.

Vì lý do đó, người gọi có trách nhiệm đẩy các thanh ghi này lên ngăn xếp nếu muốn khôi phục giá trị này sau khi thực hiện cuộc gọi thủ tục.

callee-lưu thanh ghi (thanh ghi AKA non-volatile) được sử dụng để giữ các giá trị tồn tại lâu dài mà nên được bảo tồn qua các cuộc gọi.

Khi người gọi thực hiện cuộc gọi thủ tục, người dùng có thể mong đợi những người đăng ký đó sẽ giữ cùng giá trị sau khi trở lại callee, giúp người đó tiết kiệm và khôi phục chúng trước khi quay lại người gọi.

Hy vọng điều đó sẽ hữu ích.

+2

Cụm từ khác mà tôi thích sử dụng là "cuộc gọi được ghi chú" và "giữ cuộc gọi". caller so với callee chỉ khác nhau bằng một chữ cái, và các trình biên dịch không thực sự lưu/khôi phục các regs gọi là clobbered qua các cuộc gọi (chúng chỉ cần đặt các giá trị trong regs được giữ bảo mật thay thế.) volatile so với non-volatile có thể gây nhầm lẫn với C's ' từ khóa volatile'. Vì vậy, "call-clobbered" mô tả chính xác những gì một hàm cần giả định về các hàm * khác *, thay vì cách nó có thể triển khai quy ước gọi/ABI. –

8

Callee vs người gọi đã lưu là quy ước cho người chịu trách nhiệm lưu và khôi phục giá trị trong đăng ký qua cuộc gọi. TẤT CẢ các thanh ghi là "toàn cục" ở chỗ bất kỳ mã nào ở bất cứ đâu có thể thấy (hoặc sửa đổi) một thanh ghi và những sửa đổi đó sẽ được xem bởi bất kỳ mã nào sau đó ở bất kỳ đâu. Điểm của quy ước tiết kiệm đăng ký là mã không phải là nghĩa vụ phải sửa đổi sổ đăng ký nhất định, như mã khác giả định rằng giá trị không được sửa đổi.

Trong mã ví dụ của bạn, NONE của sổ đăng ký được tiết kiệm, vì nó không cố gắng lưu hoặc khôi phục giá trị đăng ký. Tuy nhiên, nó có vẻ không phải là một thủ tục hoàn toàn, vì nó chứa một chi nhánh cho một nhãn không xác định (l$loop). Vì vậy, nó có thể là một đoạn mã từ giữa một thủ tục xử lý một số thanh ghi như callee lưu; bạn chỉ thiếu các hướng dẫn lưu/khôi phục.

Các vấn đề liên quan