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?
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. –