evm定義了8條按位運算指令,見下表:
下面是按位運算指令的操作碼分布圖:
and、or、xor指令從棧頂彈出兩個元素,進行按位運算,然後把結果推入棧頂。以and指令為例,下面是它的操作示意圖:
not指令將棧元素按位取反,下面是它的操作示意圖:
這四條指令分別與solidity語言裡的&、|、^和~運算子直接對應,下面的solidity**演示了這四條指令的具體應用(讀者可以執行solc --asm --opcodes bitwise_demo1.sol命令觀察編譯器生成的位元組碼):
// bitwise_demo1.sol
pragma solidity ^0.4.24;
contract c
}byte
byte指令先後從棧頂彈出n和x,取x的第n個位元組並推入棧頂。由於evm的字長是32個位元組,所以n在[0, 31]區間內才有意義,否則byte的運算結果就是0。另外,位元組是從左到右數的,因此第0個位元組佔據字的最高位8個位元。以n=1為例,下面是byte指令操作示意圖:
讀者可以通過下面的solidity**觀察byte指令的用法:
// byte_demo2.sol
pragma solidity ^0.4.24;
contract c
這三條位移指令是由eip-145引入的,從constantinople虛擬機器開始支援。這三條指令都是先後從棧頂彈出兩個數n和x,其中x是要進行位移操作頂數,n是位移位元數,然後把結果推入棧頂。以左移指令shl為例,下面是它的操作示意圖:
shr和sar的區別在於,前者執行邏輯右移(空缺補0),後者執行算術右移(空缺補符號位)。下表總結了這三條位移指令對於運算元的解釋,以及計算結果(這裡^
表示指數運算):
solidity語言提供了<<
和>>
運算子,下表總結了這兩個運算子的含義(這裡**
表示指數運算):
在constantinople之前,位移運算子使用exp、mul、div、sdiv等指令實現;從constantinople開始,位移運算子可以使用位移指令實現。不過請讀者注意,《運算子可以直接編譯成shl指令,但是由於取整方式不同,所以》運算子並不能直接編譯成sar指令,詳見eip-145和solidity文件。讀者可以通過下面的solidity**觀察位移指令的用法(可以通過--evm-version選項告訴solidity編譯器目標evm版本,例如solc --asm --opcodes --evm-version constantinople bitwise_demo2.sol,如不指定,預設是byzantium):
// bitwise_demo2.sol
pragma solidity ^0.4.24;
contract c
KVM虛擬機器介紹
一 kvm虛擬機器簡介 kernel based virtual machine的簡稱,是乙個開源的 系統虛擬化模組,自linux 2.6.20之後整合在linux的各個主要發行版本中。它使用linux自身的排程器進行管理,所以相對於xen,其核心原始碼很少。kvm目前已成為學術界的主流vmm之一。...
VMware ESX主機上虛擬機器檔案介紹
在這一系列的第一部分中,我們從硬體角度了解了什麼是虛擬機器。在本部分中,techtarget中國的特約虛擬化專家eric siebert將介紹esx主機上虛擬機器檔案的組成。與虛擬機器相關的檔案有很多,它們位於主機上虛擬機器的目錄裡。32.73 kb 2010 1 8 16 54 如果你使用像win...
Mac平台工具介紹 虛擬機器篇
parallels desktop 功能介紹 parallels是mac平台上一款優秀的虛擬機器軟體。它支援多種作業系統,並對windows有完美的支援。通過coherence技術,能夠讓windows應用執行時就像mac應用一樣。parallels的主要特性如下 79 主頁 vmware fusi...