【问题标题】:ECMA CLI spec: stack transition diagram notation for CIL instructionsECMA CLI 规范:CIL 指令的堆栈转换图符号
【发布时间】:2020-04-14 00:02:32
【问题描述】:

我一直在阅读 ECMA CLI 规范:

http://www.ecma-international.org/publications/standards/Ecma-335.htm

我对在堆栈转换图中使用逗号来表示某些指令感到困惑。例如,这里是ldloc(将参数加载到堆栈上)的记录堆栈转换:

… => …, value

这是ldsfld 的堆栈转换(加载类的静态字段):

…, => …, value

我的问题与指令前的额外逗号有关:它有什么意义吗?另一个例子是jmp(跳转到方法):

… => …

br.<length>(无条件分支):

…, => …

还有一些尾随逗号的示例,例如 nopstarg.<length>。这只是不一致还是我不理解这种表示法的细微差别?

【问题讨论】:

  • 可以肯定地说这没有任何意义。 jmpbr.S 的各个操作码的在线文档都使用了更明确的描述“此操作不执行评估堆栈行为”。 (ldlocldsfld 同样都表示,换句话说,单个值被压入堆栈。)幸运的是,逗号似乎是多余的,而不是 blasphemous

标签: stack specifications cil intermediate-language


【解决方案1】:

逗号只是为了向您表明评估堆栈的其余部分没有改变。堆栈之前可能有值(将东西放在堆栈上并在它们在那里时执行其他操作是很常见的)。 如果您看到… => … - 该指令根本不会更改堆栈。 如果您看到… => …, value - 该指令将一个值添加到堆栈 如果您看到…, value => … - 此指令从堆栈中删除一个值

【讨论】:

  • 这不能回答我的问题。基本上我的问题是… => ……, => … 之间有什么区别
  • 哦,我完全错过了。我只能假设这是文档中的错误。它们绝对没有任何意义。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2011-04-02
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多