以太坊虛拟機比較操作指令
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:虛拟機、編譯器、标準庫》。