【发布时间】:2018-12-27 23:59:31
【问题描述】:
我想解释一下ldelem.ref 的作用。到目前为止,我已经将 index 处的元素作为 O 加载到堆栈的顶部。
什么是索引?而且我认为 O 类型意味着对象的类型将保持不变,例如,如果它是一个字符串,它将保持一个字符串。
我在下面有一个我正在处理的代码的示例,我非常感谢您的理解。我评论了我相信我知道的。 所以在这种情况下是什么
.locals init (
string V_0,
bool V_1,
string V_2,
bool V_3,
string V_4,
string V_5,
string V_6) // Declared 6 variables
.try
{
IL_0000: nop
IL_0001: nop // Does nothing - Debug build
IL_0002: ldarg.0 // Loads Argument 0 into memory/stack
IL_0003: ldc.i4.0 // Push Constant Value 0 into memory [Possibly from a variable]
IL_0004: ldelem.ref // Loads element at index onto the top of the stack as an O
IL_0005: stloc.0 // Pop value from stack into local Variable 0
IL_0006: ldloc.0 // Load local variable 0 onto stack
IL_0007: ldstr "del" // Loads string "del" in to top of stack
IL_000c: call bool [mscorlib]System.String::op_Equality(string, string) // Compares strings to see if they are equal
IL_0011: stloc.1 // Pop value from stack into local variable 1
IL_0012: ldloc.1 // Load local variable 1 onto the stack
IL_0013: brfalse.s IL_004e // If variable 1 is true keep going else jump to IL_004e
ldelem.ref 在这里做什么?
op_Equality 是否将字符串“del”与变量 0 的内容进行比较?
我认为在调用完成后,操作的布尔值然后存储在堆栈的顶部,stloc.1 弹出布尔值并将其存储在变量 1 中,然后ldloc.1 将该变量加载到stack 和 brfalse.s 检查 Bool 值,如果 false “跳转”到 IL_004e,是这样吗?
【问题讨论】:
-
什么是索引?它是
0,因为它被IL_0003: ldc.i4.0放在堆栈上。 -
@PetSerAl 感谢您澄清这一点。这个“元素”是从哪里拉出来的?
-
来自此指令放置在堆栈上的数组:
IL_0002: ldarg.0. -
@PetSerAl 我们怎么知道 ldarg.0 是一个数组?这个数组是从哪里来的?我们怎么知道它的内容?
-
我们怎么知道 ldarg.0 是一个数组? 我们不知道。要知道您需要显示方法签名。 这个数组来自哪里?来自第一个方法参数。
标签: .net .net-assembly disassembly cil