ASM của tôi là một chút mờ về các chi tiết, nhưng tôi nghĩ rằng tôi có thể cung cấp cho bạn một ý tưởng chung.
ESP: Con trỏ ngăn xếp, EBP: Con trỏ cơ sở.
movl $1f, (%0)
Di chuyển giá trị 0x1f vào tham số 0 (từ).
movl %%esp, 4(%0)
Chuyển nội dung của thanh ghi ESP thành (từ + 4).
movl %%ebp, 8(%0)
Di chuyển nội dung đăng ký EBP vào (từ + 8).
movl 8(%1), %%ebp
Chuyển nội dung từ (đến + 8) vào thanh ghi EBP.
movl 4(%1), %%esp
Di chuyển nội dung (đến + 4) vào thanh ghi ESP.
jmp *(%1)
Chuyển đến địa chỉ chứa trong (đến).
"1:" là nhãn nhảy.
"+ S" khai báo tham số "nguồn" (đọc), "+ D" tham số đích (ghi). Danh sách các thanh ghi ở cuối câu lệnh là danh sách "clobber", một danh sách các thanh ghi có thể được sửa đổi bởi mã ASM, do đó trình biên dịch có thể thực hiện các bước để duy trì tính nhất quán (ví dụ, không dựa vào ví dụ ECX. như trước).
Tôi đoán coco_ctx có nghĩa là "ngữ cảnh coco". Vì vậy: Chức năng lưu khung ngăn xếp hiện tại trong cấu trúc "từ" và đặt khung ngăn xếp thành những gì được lưu trong cấu trúc "đến". Về cơ bản, nó nhảy từ hàm hiện tại sang một hàm khác.
Đó là hoàn toàn đúng. Nó không chỉ nhảy từ chức năng này sang chức năng khác, mặc dù: nó nhảy từ toàn bộ ngăn xếp cuộc gọi này sang ngăn xếp khác; nó hoàn toàn chuyển đổi ngữ cảnh thực thi. (Ngoài ra, gosh nhưng GCC cú pháp lắp ráp nội tuyến là kỳ lạ.) – Crashworks
Đó là cú pháp AT & T (http://wiki.osdev.org/Opcode_syntax) được bao bọc trong cú pháp C-call-like (http://wiki.osdev.org)/Inline_Assembly). Bạn sẽ không tin nhưng tôi thực sự thích nó hơn cú pháp "chuẩn" của Intel. ;-) – DevSolar
Công tắc ngữ cảnh cũng hoạt động với C++ hay tôi phải viết một số khác biệt cho thiscall? – jameszhao00