Tôi đang duyệt qua nguồn của các triển khai khác nhau setjmp
và longjmp
và nhận thấy rằng không phải tất cả các thanh ghi CPU được lưu trong cấu trúc jmp_buf
. Sau khi xem xét AMD64 ABI, tôi nhận thấy rằng chỉ những thanh ghi được lưu trữ bằng callee mới được lưu.Tại sao setjmp (3) không lưu tất cả các thanh ghi trên AMD64?
Tôi không hiểu cách trạng thái chức năng có thể được tiếp tục hoàn toàn khi chỉ một số thanh ghi đã được lưu. Chắc chắn các thanh ghi chưa được lưu lại phải được ghi đè nhiều lần nhiều lần cho đến khi tôi gọi longjmp
sau này?
Mọi thứ hoạt động hoàn hảo, vì vậy chắc chắn có điều gì đó mà tôi không hiểu. Tôi đã hy vọng ai đó có thể làm sáng tỏ điều này.
Cảm ơn!
Có các triển khai setjmp chỉ lưu con trỏ/con trỏ khung (xem 'libunwind'). Những người có setjmp rất nhanh nhưng thời gian longjmp tương đối chậm và được dựa trên các bảng khung mô tả cách khôi phục các thanh ghi khác từ các vị trí được lưu giữ bởi người gọi và như vậy. –
Tôi có thể tìm thấy nguồn bạn đang xem ở đâu? – nullpotent
@AljoshaBre Đây là những điều dễ đọc nhất mà tôi đã tìm thấy cho đến nay: [setjmp] (http://git.etalabs.net/cgi-bin/gitweb.cgi?p=musl;a=blob;f=src/setjmp /x86_64/setjmp.s;h=98f58b8d6551e391f426fc53c81678a03ac89074;hb=HEAD) và [longjmp] (http://git.etalabs.net/cgi-bin/gitweb.cgi?p=musl;a=blob;f=src/ setjmp/x86_64/longjmp.s; h = e175a4b9606bba41eccc8972c22244e533718f0a; hb = HEAD). – haste