1. 程式人生 > >以太坊虛擬機器介紹5-比較操作指令

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

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

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

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

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儲存相關指令。