天天看點

以太坊虛拟機介紹5-比較操作指令以太坊虛拟機比較操作指令

以太坊虛拟機比較操作指令

EVM定義了6條比較操作指令,見下表:

比較操作指令 操作碼 說明
LT 0x10 無符号小于比較
GT 0x11 無符号大于比較
SLT 0x12 有符号小于比較
SGT 0x13 有符号大于比較
EQ 0x14 等于比較
ISZERO 0x15 布爾取反

下面是比較操作指令的操作碼分布圖:

以太坊虛拟機介紹5-比較操作指令以太坊虛拟機比較操作指令

LT、GT、SLT、SGT、EQ

這5條指令都是從棧頂彈出兩個元素,進行比較,然後把結果(1表示true,0表示false)推入棧頂。其中LT和GT把彈出的元素解釋為無符号整數進行比較,SLT和SGT把彈出的元素解釋為有符号數進行比較,EQ不關心符号。以LT指令為例,下面是它的操作示意圖:

以太坊虛拟機介紹5-比較操作指令以太坊虛拟機比較操作指令

ISZERO

ISZERO指令從棧頂彈出一個元素,判斷它是否為0,如果是,則把1推入棧頂,否則把0推入棧頂。下面是ISZERO指令的操作示意圖:

以太坊虛拟機介紹5-比較操作指令以太坊虛拟機比較操作指令

執行個體分析

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:虛拟機、編譯器、标準庫》。

繼續閱讀