2012-07-28 6 views
6

.net. 메서드의 마지막 명령으로 존재할 수있는 OpCode는 무엇입니까? 순간 메소드의 마지막 명령에 대한 OpCode는 무엇입니까?

가 나는

그러나 그것은 다른 opcode를 할 수 있습니까? 그리고 만약 그렇다면 어떤 코드 (C# 선호)가 그들을 생성합니까? throw이 방법의 마지막 연산 코드가 될 수있는 경우

+2

"마지막"은 메서드 본문에 정의 된 마지막 opcode를 의미합니까, 아니면 마지막 opcode가 실행되었음을 의미합니까? (메소드가 맨 아래에서 종료 할 필요는 없습니다) –

+0

@MarcGravell "메소드 본문에 정의 된 최종 opcode". 질문에 명확히 대답 – Simon

+0

멋지다, 나는 프레드릭의 게시물에 덧붙여 논평을 의심한다. –

답변

2

"마지막"내 말은 "메소드 본문에 정의 된 최종 동작 코드"으로

, 기회는 jmp도한다는 사실에있다. 우리가 누구의 종료 조건 말에 있지 재귀 적 방법을 고려하는 경우

또한, 마지막 연산 코드는 call 또는 대신 rettail.call 수 있습니다.

업데이트 : 글쎄, 그렇지 않습니다. 마크 Gravell이 정당하게 자신의 의견에서 지적 하듯이, tail.call에 대한 설명서는 말한다 :

스택은 다음의 호출에 의해 전송되는 인수를 제외하고 비어 있어야합니다. 호출 명령 다음의 명령어는 ret이어야합니다.

업데이트 2 :의 종료 시점 이전에 (다시 감사 마크)을 발생하면 brbr.s 같은 무조건 분기 옵 코드는, 메소드의 마지막 지시 할 수있다.

+1

"call"은 여전히 ​​iirc의 뒤에 ret가 필요할 것이다. tail.call 잘 모르겠다. (업데이트 : 꼬리 쪽의 콜 명령 다음 명령어는 ret이어야한다.) 나는 "jmp"가 유효하다고 생각한다. –

+2

무조건 분기 : br와 br.s는 (* 종료 * 더 높은 방법으로) - 마지막의 의미에 따라 (OP를 요청할 것입니다) –