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

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

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

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

下面是比較操作指令的操作碼分佈圖:
comparison ops

LT、GT、SLT、SGT、EQ

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

ISZERO

ISZERO指令從棧頂彈出一個元素,判斷它是否爲0,如果是,則把1推入棧頂,否則把0推入棧頂。下面是ISZERO指令的操作示意圖:
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:虛擬機、編譯器、標準庫》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章