zoukankan      html  css  js  c++  java
  • 以太坊虚拟机介绍5-比较操作指令

    以太坊虚拟机比较操作指令

    EVM定义了6条比较操作指令,见下表:

    下面是比较操作指令的操作码分布图: 

    LT、GT、SLT、SGT、EQ
    这5条指令都是从栈顶弹出两个元素,进行比较,然后把结果(1表示true,0表示false)推入栈顶。其中LT和GT把弹出的元素解释为无符号整数进行比较,SLT和SGT把弹出的元素解释为有符号数进行比较,EQ不关心符号。以LT指令为例,下面是它的操作示意图:

    ISZERO

    ISZERO指令从栈顶弹出一个元素,判断它是否为0,如果是,则把1推入栈顶,否则把0推入栈顶。下面是ISZERO指令的操作示意图:

    实例分析
    Solidity编译器使用LT和SLT指令实现小于运算符(<),使用GT和SGT指令实现大于运算符(>),使用EQ指令实现等于运算符(==),使用ISZERO指令实现布尔取反运算符(!)。读者可以编译下面这个智能合约(solc --asm --opcodes comparison_demo.sol),观察比较操作指令的使用:

    // comparison_demo.sol
    pragma solidity ^0.4.24;

    contract C {

    function test() public pure {
    int s1; int s2;
    uint u1; uint u2;

    bool b1 = u1 < u2; // LT
    bool b2 = u1 > u2; // GT
    bool b3 = s1 < s2; // SLT
    bool b4 = s1 > s2; // SGT
    bool b5 = s1 == s2; // EQ
    bool b6 = !b5; // ISZERO
    }

    }

    总结

    本文介绍了EVM比较操作指令,下一篇文章将介绍EVM存储相关指令。

  • 相关阅读:
    Spring AOP总结(三)
    Spring AOP源码解析(二)
    java9新特性
    BeanFactory和ApplicationContext的区别总结
    Elasticsearch7.X为什么移除类型(type)
    elasticsearch性能优化(二)
    elasticsearch性能优化(一)
    elasticsearch的master选举机制
    自动化构建和部署应用系统平台
    关系型数据库之mysql-01
  • 原文地址:https://www.cnblogs.com/405845829qq/p/9998262.html
Copyright © 2011-2022 走看看