C#에서 IL (CIL/MSIL 등)로 코드를 변환 중입니다. 조건부에 붙어있는 이유는 다음에 저장할 수 있기를 원하기 때문입니다. 무료 위치입니다. 예 :CIL의 조건부 - 다음 무료 위치를 저장하는 방법은 무엇입니까?
var x = 0;
if(x > 20)
x = 1;
Console.WriteLine(x);
나는 이것이 내가 올바른 IL 믿고 무엇을 변환하면, 내가 얻을 :
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.s 14
IL_0006: cgt
IL_0008: ldc.i4.0
IL_0009: ceq
IL_000B: stloc.1
IL_000C: ldloc.1
IL_000D: brtrue.s IL_0011
IL_000F: ldc.i4.1
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: call System.Console.WriteLine
나는 이것이 올바른 IL 생각하는,하지만 내 예는 매우 정적이다. 당신이 IL 코드에서 볼 경우,이 loc.1에 CEQ의 결과를 저장하는 것은
그리고 이렇게 내 문제입니다 - 컴파일러는 loc.0 이미 (변수를 'X') 찍은보고 다음을 사용 자유로운 위치는 1이었습니다. 제 목표는 주어진 메소드가 조건부 변수 앞에 N 변수를 가질 수있는 곳에서 동적으로 이것을 수행하는 것입니다. 어떻게, C#을에서, op 코드 "가. stloc nextAvailable을"말을 방출하고 등가 하중의 않습니다 :
그래서, 마지막으로, 여기에 내 질문입니까?
이 왜 전혀 경우를 저장할 않습니다 내가 릴리스 모드를 기대
은 (는 사전에
Console.WriteLine(0);
까지 전체를 최적화하지한다면) IL 더 같이하기 위해 생성 값의 사용은 다음 명령어에서로드하는 것입니다. – harold어쨌든 bool을 0과 비교하는 이유는 무엇입니까? IL은'ceq' 명령 @harold – harold
는 그렇지 않은 경우가 동일하면 1을 푸시 또는 0 다음이를 비교 평가 스택의 최상위 두 값을 팝하고. – dlev