以太坊虛擬機比較操作指令
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 ^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存儲相關指令。如果大家對編程語言虛擬機有更多的興趣,請關注我寫的《自己動手寫Java虛擬機》,以及馬上將要出版的《自己動手實現Lua:虛擬機、編譯器、標準庫》。