Tôi hiện đang gặp phải sự cố mới với các nhà khai thác. Sử dụng mã sau đây, tôi muốn tạo đầu ra giống như khi sử dụng cặp if ... else
trong C#.Phản ánh C#: Nếu ... khác?
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)}));
g.Emit(OpCodes.Ldc_I4, 0);
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S,);
var action = (Action)method.CreateDelegate(typeof(Action));
action();
Console.Read();
Câu hỏi của tôi là:
- Làm thế nào tôi có thể nhận được địa chỉ của một hướng dẫn để vượt qua nó như một tham số cho các opcodes chi nhánh?
- Có sự khác biệt giữa
BR
vàBR_S
,Brtrue
vàBrtrue_S
,Brfalse
vàBrfalse_S
và hướng dẫn tương tự?
Cảm ơn.
Như những người khác đã đề cập, các phiên bản "_S" của các hướng dẫn chi nhánh lấy chênh lệch 1 byte thay vì 4 byte. Nếu bạn biết rằng nhánh của bạn sẽ luôn nằm trong phạm vi sẵn có (-128 byte đến +127 byte), thì bạn sẽ nhận được mã nhỏ gọn hơn bằng cách sử dụng chúng, tuy nhiên nếu bạn cố gắng sử dụng chúng để chuyển đến nhãn có bù đắp bên ngoài phạm vi này, một ngoại lệ sẽ được ném khi tạo đại biểu. – Iridium