操作码 JUMP 在 EVM 堆栈中如何工作?

How does the opcode JUMP work in the EVM Stack?

我正在学习 "Advanced Solidity" 教程 here

我 运行 举了一个我无法理解的例子。

在这个例子中,为什么JUMP会影响栈的状态?我预计它只会影响程序计数器。

(即我希望在 JUMP 之后,在 PC:11,堆栈的长度将是 3,而不是 2。JUMP 出现在 PUSH 0x0B 之后。)

谢谢。

想通了。

JUMP 将堆栈顶部的值用作目标。 该值 "becomes" 目的地。

A JUMP 可以被认为是首先执行 PUSH,然后将程序计数器移动到推送的值。

归功于 ethereum/tests Gitter 上的 Martin / @holiman。谢谢

仅供参考原文档。如 yellow paper 所述:

0x56 JUMP 1 0 改变程序计数器

其中 1 是从堆栈中取出的项目数,0 是返回的项目数。因此,在您的情况下,JUMP 从堆栈中删除“0b”并将其用作目标 (PC = 11 = 0x0b)。