.net 存储当前指令位置

.net 存储当前指令位置,.net,compiler-construction,il,.net,Compiler Construction,Il,是否有任何方法可以存储当前指令的位置,以便将来某个时候可以分支回它 我正在尝试实现一些类似GOSUB的功能 现在,分支指令接受一个参数,该参数表示相对于要跳转到的当前位置的字节数。将标签存储到我想去的地方,然后分支到它,这很容易。如果我可以在分支之前存储当前位置,当返回时,我可以获取新的当前位置-存储的位置并将其传递给分支 但是我不知道怎么做。。有什么想法吗?Afaik(我做了大量的IL),不,这是不可能的,即使是这样,也几乎肯定会导致无法验证的IL(不好),因为无法证明堆栈是平衡的。还要记住,

是否有任何方法可以存储当前指令的位置,以便将来某个时候可以分支回它

我正在尝试实现一些类似GOSUB的功能

现在,分支指令接受一个参数,该参数表示相对于要跳转到的当前位置的字节数。将标签存储到我想去的地方,然后分支到它,这很容易。如果我可以在分支之前存储当前位置,当返回时,我可以获取新的当前位置-存储的位置并将其传递给分支

但是我不知道怎么做。。有什么想法吗?

Afaik(我做了大量的IL),不,这是不可能的,即使是这样,也几乎肯定会导致无法验证的IL(不好),因为无法证明堆栈是平衡的。还要记住,偏移量是IL指令的一部分,而不是堆栈-因此不能将其存储在本地(或堆栈上)并重新加载

只需更清晰地构造代码;在需要调用子方法的地方使用调用,也可以使用跳转表(“开关”)

Afaik(我做了大量的IL),不,这是不可能的,即使是这样,也几乎肯定会导致无法验证的IL(不好),因为无法证明堆栈是平衡的。还要记住,偏移量是IL指令的一部分,而不是堆栈-因此不能将其存储在本地(或堆栈上)并重新加载


只需更清晰地构造代码;在需要调用子方法的地方使用调用,也可以使用跳转表(“开关”)

谢谢你的回复。我希望避免调用新方法,因为这会抹去评估堆栈。我正在尝试编写一个基于堆栈的编译器,其中包含一个全局堆栈。我想我得重新考虑一下……谢谢你的回复。我希望避免调用新方法,因为这会抹去评估堆栈。我正在尝试编写一个基于堆栈的编译器,其中包含一个全局堆栈。我想我得重新考虑一下。。。