IL 코드 명령어들

2025. 9. 7. 18:31STUDY/C#

728x90
반응형

힙 객체(참조 타입 인스턴스)의 맴버 변수접근

ldfld(load field) / stfld(storefield) -> 객체의 인스턴스 필드를 읽거나 쓸때 사용

 

로컬 변수를 읽고 쓸 때

예제 코드

// 인스턴스 메서드라고 가정 (this 사용 예시를 위해)
class Sample
{
    void Demo(ref int a, int b)
    {
        int x = a + b;   // 로컬 x
        x = x + 5;       // 로컬 x 갱신
        a = x;           // ref 인자 a에 값 써넣기
        System.Console.WriteLine(x);
    }
}

IL 코드

.method private hidebysig instance void Demo(int32& a, int32 b) cil managed
{
  .locals init ([0] int32 x)

  // x = a + b;
  IL_0000: ldarg.1          // a (byref) → 스택에 로드 (관리 포인터)
  IL_0001: ldind.i4         // *a 를 읽어서 int32 값으로
  IL_0002: ldarg.2          // b → 스택
  IL_0003: add              // (*a + b)
  IL_0004: stloc.0          // 로컬 0번(x)에 저장

  // x = x + 5;
  IL_0005: ldloc.0          // x → 스택
  IL_0006: ldc.i4.5         // 5 → 스택
  IL_0007: add
  IL_0008: stloc.0          // x 다시 저장

  // a = x; (ref 인자에 값 써넣기)
  IL_0009: ldarg.1          // a(byref) → 포인터 로드
  IL_000a: ldloc.0          // x 값 로드
  IL_000b: stind.i4         // *a = x  (byref 타겟에 저장)

  // Console.WriteLine(x);
  IL_000c: ldloc.0
  IL_000d: call void [System.Console]System.Console::WriteLine(int32)

  IL_0012: ret
}

명령어 역할 정리

ldloc.n LoaD LOCal 로컬 변수 n번(슬롯)의 값을 스택에 올림
stloc.n STore LOCal 스택 top 값을 로컬 변수 n번(슬롯)에 저장
ldarg.n LoaD ARGument n번째 메서드 인자(슬롯)를 스택에 올림 (인스턴스 메서드의 this는 보통 ldarg.0)
starg.n STore ARGument 스택 top 값을 인자 n번(슬롯)에 저장 (C#에선 드묾)

 

++..

728x90
반응형

'STUDY > C#' 카테고리의 다른 글

[C#] 클로저(closure)  (0) 2025.09.07
공용 언어 런타임(CLR)의 실행 모델  (1) 2025.02.02
[C#] async, await  (0) 2024.12.04
[C#] 동기 비동기 개념 이해하기  (0) 2024.11.28
[C#] Array vs List vs ArrayList  (0) 2024.11.12