EVM 比较指令集

在以太坊虚拟机(EVM)中,比较运算符用于比较堆栈上的数值,并返回布尔结果(0 或 1)。以下是详细介绍 EVM 中的比较运算符指令,包括 LT、GT、SLT、SGT、EQ 和 ISZERO。

1.小于指令 LT

  • 操作码: 0x10
  • 功能: 比较堆栈顶端的第二个数值是否小于堆栈顶端的第一个数值。如果是,将 1 推送到堆栈顶端;否则,推送 0。
  • 气体费用: 3 gas
  • 示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract LTExample {
    function lessThan(uint256 a, uint256 b) public pure returns (bool) {
        bool result;
        assembly {
            result := lt(a, b)
        }
        return result;
    }
}

2.大于指令 GT

  • 操作码: 0x11
  • 功能: 比较堆栈顶端的第二个数值是否大于堆栈顶端的第一个数值。如果是,将 1 推送到堆栈顶端;否则,推送 0。
  • 气体费用: 3 gas
  • 示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract GTExample {
    function greaterThan(uint256 a, uint256 b) public pure returns (bool) {
        bool result;
        assembly {
            result := gt(a, b)
        }
        return result;
    }
}

3.有符号小于指令 SLT

  • 操作码: 0x12
  • 功能: 进行有符号整数比较,检查堆栈顶端的第二个数值是否小于堆栈顶端的第一个数值。如果是,将 1 推送到堆栈顶端;否则,推送 0。
  • 气体费用: 3 gas
  • 示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SLTExample {
    function signedLessThan(int256 a, int256 b) public pure returns (bool) {
        bool result;
        assembly {
            result := slt(a, b)
        }
        return result;
    }
}

6.有符号大于指令 SGT

  • 操作码: 0x13
  • 功能: 进行有符号整数比较,检查堆栈顶端的第二个数值是否大于堆栈顶端的第一个数值。如果是,将 1 推送到堆栈顶端;否则,推送 0。
  • 气体费用: 3 gas
  • 示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SGTExample {
    function signedGreaterThan(int256 a, int256 b) public pure returns (bool) {
        bool result;
        assembly {
            result := sgt(a, b)
        }
        return result;
    }
}

7.等于指令 EQ

  • 操作码: 0x14
  • 功能: 比较堆栈顶端的两个数值是否相等。如果相等,将 1 推送到堆栈顶端;否则,推送 0。
  • 气体费用: 3 gas
  • 示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract EQExample {
    function equal(uint256 a, uint256 b) public pure returns (bool) {
        bool result;
        assembly {
            result := eq(a, b)
        }
        return result;
    }
}

8.是否为零指令 ISZERO

  • 操作码: 0x15
  • 功能: 检查堆栈顶端的数值是否为零。如果是,将 1 推送到堆栈顶端;否则,推送 0。
  • 气体费用: 3 gas
  • 示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ISZEROExample {
    function isZero(uint256 a) public pure returns (bool) {
        bool result;
        assembly {
            result := iszero(a)
        }
        return result;
    }
}

全部评论(0)