以太坊虚拟机比较操作指令
EVM定义了6条比较操作指令,见下表:
比较操作指令 | 操作码 | 说明 |
---|---|---|
LT | 0x10 | 无符号小于比较 |
GT | 0x11 | 无符号大于比较 |
SLT | 0x12 | 有符号小于比较 |
SGT | 0x13 | 有符号大于比较 |
EQ | 0x14 | 等于比较 |
ISZERO | 0x15 | 布尔取反 |
下面是比较操作指令的操作码分布图:

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 ^.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存储相关指令。如果大家对编程语言虚拟机有更多的兴趣,请关注我写的《自己动手写Java虚拟机》,以及马上将要出版的《自己动手实现Lua:虚拟机、编译器、标准库》。