我一直在阅读ECMA CLI规范:
http://www.ecma-international.org/publications/standards/Ecma-335.htm
我对一些指令在堆栈转换图中使用逗号感到困惑。例如,以下是ldloc
(将参数加载到堆栈上(的堆栈转换文档:
… => …, value
这里是ldsfld
(类的加载静态字段(的堆栈转换:
…, => …, value
我的问题与指令前的逗号有关:它有任何意义吗?另一个例子是jmp
(跳转到方法(:
… => …
和br.<length>
(无条件分支(:
…, => …
也有尾随逗号的例子,例如nop
和starg.<length>
。这只是一个不一致,还是这个符号有我不理解的细微差别?
逗号只是为了向您表明评估堆栈的其余部分不会更改。堆栈以前可能有值(在堆栈中放置内容并在它们存在时执行其他操作是非常常见的(。如果您看到… => …
,则此指令根本不会更改堆栈。如果您看到… => …, value
,则此指令会向堆栈添加一个值如果您看到…, value => …
-此指令从堆栈中删除一个值