以太坊虚拟机介绍2-栈操作指令

以太坊虚拟机栈操作指令

上一篇文章对EVM和它的指令集进行了简单介绍,本文将介绍POP指令、PUSHx系列指令、DUPx系列指令、SWAPx系列指令。这些指令只对EVM栈进行单纯的操作,它们的操作码分布如下图所示:

以太坊虚拟机介绍2-栈操作指令_第1张图片

POP指令

POP指令(操作码0x50)从栈顶弹出一个元素。下面是POP指令的操作示意图(白色表示元素即将发生变动):

以太坊虚拟机介绍2-栈操作指令_第2张图片

PUSHx指令

PUSH系列指令把紧跟在指令后面的N(1 ~ 32)字节元素推入栈顶。PUSH系列指令一共有32条,从PUSH1(操作码0x60)一直到PUSH32(操作码0x7A)。EVM是大端机器,以PUSH2指令为例,下面是该指令的操作示意图(不完整的灰色纸带表示字节码):

以太坊虚拟机介绍2-栈操作指令_第3张图片

DUPx指令

DUP系列指令复制从栈顶开始数的第N(1 ~ 16)个元素,并把复制后的元素推入栈顶。DUP系列指令一共有16条,从DUP1(操作码0x80)一直到DUP16(操作码0x8A)。比如PUSH1指令复制栈顶元素,如下图所示:

以太坊虚拟机介绍2-栈操作指令_第4张图片

下面是DUP2指令的操作示意图:

以太坊虚拟机介绍2-栈操作指令_第5张图片

SWAPx指令

SWAP系列指令把栈顶元素和从栈顶开始数的第N(1 ~ 16)+ 1 个元素进行交换。SWAP系列指令一共有16条,从SWAP1(操作码0x90)一直到SWAP16(操作码0x9A)。比如SWAP1指令交换位于栈顶的两个元素,如下图所示:

以太坊虚拟机介绍2-栈操作指令_第6张图片

下面是SWAP2指令的操作示意图:

以太坊虚拟机介绍2-栈操作指令_第7张图片

实例分析

我们用Solidity语言编写一个简单的智能合约,看看以上这些指令是如何应用的:

// stack_demo.sol
pragma solidity ^0.4.24;

contract C {
    function foo() public view {
        uint32 x = 3;
        uint32 y = 4;
        uint32 z = x + y;
    }
}

solc --asm stack_demo.sol命令编译上面的智能合约,观察编译器生产的汇编代码(下面仅给出部分输出):

ASM

    tag_5:
        /* "stack_demo.sol":80:88  uint32 x */
      0x0
        /* "stack_demo.sol":102:110  uint32 y */
      dup1
        /* "stack_demo.sol":124:132  uint32 z */
      0x0
        /* "stack_demo.sol":91:92  3 */
      0x3
        /* "stack_demo.sol":80:92  uint32 x = 3 */
      swap3
      pop
        /* "stack_demo.sol":113:114  4 */
      0x4
        /* "stack_demo.sol":102:114  uint32 y = 4 */
      swap2
      pop
        /* "stack_demo.sol":139:140  y */
      dup2
        /* "stack_demo.sol":135:136  x */
      dup4
        /* "stack_demo.sol":135:140  x + y */
      add
        /* "stack_demo.sol":124:140  uint32 z = x + y */
      swap1
      pop
        /* "stack_demo.sol":43:147  function foo() public view {... */
      pop
      pop
      pop
      jump  // out

我们暂时忽略ADD指令和JUMP指令,下面是指令操作示意图(指令从左到右执行,指令上面是指令操作之后的栈状态):

以太坊虚拟机介绍2-栈操作指令_第8张图片

总结

本文介绍了EVM栈操作指令,下一篇文章将介绍EVM算术运算指令。如果大家对编程语言虚拟机有更多的兴趣,请关注我写的《自己动手写Java虚拟机》,以及马上将要出版的《自己动手实现Lua:虚拟机、编译器、标准库》。

你可能感兴趣的:(EVM)