IL 코드 명령어들
2025. 9. 7. 18:31ㆍSTUDY/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 |