2012-07-28 48 views
6

Trong .net các mã OpCodes có thể tồn tại như lệnh cuối cùng của phương thức.OpCodes có thể cho lệnh cuối cùng của một phương thức là gì?

Tại thời điểm này tôi biết rằng nó có thể được

Nhưng là nó có thể cho nó được bất kỳ opcodes khác? Và nếu như vậy những gì mã (thích C#) sẽ sản xuất chúng?

Bởi tôi có nghĩa là "opcode thức được định nghĩa trong cơ thể phương pháp" "Last"

+2

Bằng "cuối cùng", ý của bạn là mã opcode cuối cùng được xác định trong phần thân phương thức, hoặc bạn có nghĩa là opcode cuối cùng được thực hiện? (một phương thức không cần phải thoát ra từ phía dưới) –

+0

@MarcGravell "mã opcode cuối cùng được định nghĩa trong phần thân phương thức". làm rõ trong câu hỏi – Simon

+0

Cool, sau đó tôi nghi ngờ các bình luận tôi thêm vào bài Frederic áp dụng –

Trả lời

2

Nếu throw có thể là opcode cuối cùng trong một phương pháp, cơ hội được rằng jmp cũng đủ điều kiện.

Ngoài ra, nếu chúng ta xem xét một phương pháp đệ quy có điều kiện thoát không nằm ở cuối, opcode cuối cùng thể là một call hoặc tail.call thay vì một ret.

Cập nhật: Vâng, không, không. Như Marc Gravell đúng là chỉ ra trong bình luận của ông, tài liệu cho tail.call nói:

Các ngăn xếp phải trống ngoại trừ cho các đối số được chuyển giao bởi cuộc gọi sau. Hướng dẫn theo hướng dẫn gọi phải là ret.

Cập nhật 2: opcodes chi nhánh vô điều kiện như brbr.s cũng có thể là hướng dẫn cuối cùng của một phương pháp, nếu điểm thoát của nó xảy ra trước đó (nhờ một lần nữa Marc).

+1

"cuộc gọi" vẫn sẽ cần một ret sau khi nó, iirc; tail.call Tôi không chắc chắn về (cập nhật: "Các hướng dẫn sau lệnh gọi phải là một ret", từ trang đuôi). Tôi nghĩ rằng "jmp" là hợp lệ, mặc dù. –

+2

Hai chi tiết khác để thay thế số 2 tôi đã giết: nhánh vô điều kiện: 'br' và' br.s' (với phương thức * thoát * cao hơn) - tùy thuộc vào ý nghĩa "cuối cùng" (tôi sẽ hỏi OP) –