以太坊vm系列1-指令集汇总

前言

EVM的重要性不言而喻,为方便后面进一步研究和探索,小编在此先列出其中涉及到的汇编指令。

这些指令在以太坊的源码中的位置:src/github.com/ethereum/go-ethereum/core/vm/opcodes.go,不太直观

指令级

当前ethereum-go版本:1.8.4
指令的功能以及每个指令的费用,小编后面会根据使用情况,逐步补充的,一下子去写,量太大了

16进制指令功能描述
0x00STOP停止
0x01ADD两数相加
0x02MUL两数相乘
0x03SUB栈中推出栈顶元素,减去新的栈顶元素,
栈顶修改为新的运算结果。
0x04DIV两个无符号数相除
0x05SDIV
0x06MOD
0x07SMOD
0x08ADDMOD
0x09MULMOD
0x0aEXP从栈顶起,依次取出2个元素,第一个元素为底数,
第二个元素为指数,计算结果进栈。
0x0bSIGNEXTEND
0x10LT栈中pop出栈顶元素x,
与栈中新的栈顶元素y比较,
栈顶修改为新的运算结果(x
0x11GT
0x12SLT
0x13SGT
0x14EQ
0x15ISZERO判断栈顶元素若大于0,则栈顶元素改为0,否则改为1。
0x16AND与运算
0x17OR栈中推出栈顶元素,与新的栈顶元素或运算,
栈顶修改为新的运算结果。
0x18XOR
0x19NOT栈顶数据取反,但实际运算还需要转为补码
0x1aBYTE
0x20SHA3该过程在evm中是`SHA3操作`,
pop出栈中两个元素偏离值m和大小n,
结合内存中的两个数据x,y生成为32字节的hash,
然后压入栈。
0x30ADDRESS
0x31BALANCE
0x32ORIGIN
0x33CALLER
0x34CALLVALUE
0x35CALLDATALOAD
0x36CALLDATASIZE
0x37CALLDATACOPY
0x38CODESIZE
0x39CODECOPY
0x3aGASPRICE
0x3bEXTCODESIZE
0x3cEXTCODECOPY
0x40BLOCKHASH
0x41COINBASE
0x42TIMESTAMP
0x43NUMBER
0x44DIFFICULTY
0x45GASLIMIT
0x50POP丢弃栈顶元素
0x51MLOAD
0x52MSTORE先后pop出两个元素x,y,内存中将y存在地址x
0x53MSTORE8
0x54SLOAD
0x55SSTORE将某数据存储到某个数据槽(地址),一个槽32字节
0x56JUMP
0x57JUMPI栈中先后pop出两个值x,y,x表示跳转到第几个JUMPDEST,
而y表示一个标记(若为0,则跳到下一个JUMPDEST),
若y不为0,则由x决定跳到第几个。
0x58PC
0x59MSIZE
0x5aGAS
0x5bJUMPDESTJUMPI可跳到此处,继续执行后面的命令。
该指令只起一个flag作用,帮助跳转
0x60PUSH1二进制数据推送到栈顶,数据1个字节
0x61PUSH2二进制数据推送到栈顶,数据2个字节
0x62PUSH3二进制数据推送到栈顶,数据3个字节
0x63PUSH4二进制数据推送到栈顶,数据4个字节
0x64PUSH5二进制数据推送到栈顶,数据5个字节
0x65PUSH6二进制数据推送到栈顶,数据6个字节
0x66PUSH7二进制数据推送到栈顶,数据7个字节
0x67PUSH8二进制数据推送到栈顶,数据8个字节
0x68PUSH9二进制数据推送到栈顶,数据9个字节
0x69PUSH10二进制数据推送到栈顶,数据10个字节
0x6aPUSH11二进制数据推送到栈顶,数据11个字节
0x6bPUSH12二进制数据推送到栈顶,数据12个字节
0x6cPUSH13二进制数据推送到栈顶,数据13个字节
0x6dPUSH14二进制数据推送到栈顶,数据14个字节
0x6ePUSH15二进制数据推送到栈顶,数据15个字节
0x6fPUSH16二进制数据推送到栈顶,数据16个字节
0x70PUSH17二进制数据推送到栈顶,数据17个字节
0x71PUSH18二进制数据推送到栈顶,数据18个字节
0x72PUSH19二进制数据推送到栈顶,数据19个字节
0x73PUSH20二进制数据推送到栈顶,数据20个字节
0x74PUSH21二进制数据推送到栈顶,数据21个字节
0x75PUSH22二进制数据推送到栈顶,数据22个字节
0x76PUSH23二进制数据推送到栈顶,数据23个字节
0x77PUSH24二进制数据推送到栈顶,数据24个字节
0x78PUSH25二进制数据推送到栈顶,数据25个字节
0x79PUSH26二进制数据推送到栈顶,数据26个字节
0x7aPUSH27二进制数据推送到栈顶,数据27个字节
0x7bPUSH28二进制数据推送到栈顶,数据28个字节
0x7cPUSH29二进制数据推送到栈顶,数据29个字节
0x7dPUSH30二进制数据推送到栈顶,数据30个字节
0x7ePUSH31二进制数据推送到栈顶,数据31个字节
0x7fPUSH32二进制数据推送到栈顶,数据32个字节
0x80DUP1从栈顶起,将栈中第1个元素复制并加入栈顶
0x81DUP2从栈顶起,将栈中第2个元素复制并加入栈顶
0x82DUP3从栈顶起,将栈中第3个元素复制并加入栈顶
0x83DUP4从栈顶起,将栈中第4个元素复制并加入栈顶
0x84DUP5从栈顶起,将栈中第5个元素复制并加入栈顶
0x85DUP6从栈顶起,将栈中第6个元素复制并加入栈顶
0x86DUP7从栈顶起,将栈中第7个元素复制并加入栈顶
0x87DUP8从栈顶起,将栈中第8个元素复制并加入栈顶
0x88DUP9从栈顶起,将栈中第9个元素复制并加入栈顶
0x89DUP10从栈顶起,将栈中第10个元素复制并加入栈顶
0x8aDUP11从栈顶起,将栈中第11个元素复制并加入栈顶
0x8bDUP12从栈顶起,将栈中第12个元素复制并加入栈顶
0x8cDUP13从栈顶起,将栈中第13个元素复制并加入栈顶
0x8dDUP14从栈顶起,将栈中第14个元素复制并加入栈顶
0x8eDUP15从栈顶起,将栈中第15个元素复制并加入栈顶
0x8fDUP16从栈顶起,将栈中第16个元素复制并加入栈顶
0x90SWAP1栈顶元素和它下面的第1项进行交换
0x91SWAP2栈顶元素和它下面的第2项进行交换
0x92SWAP3栈顶元素和它下面的第3项进行交换
0x93SWAP4栈顶元素和它下面的第4项进行交换
0x94SWAP5栈顶元素和它下面的第5项进行交换
0x95SWAP6栈顶元素和它下面的第6项进行交换
0x96SWAP7栈顶元素和它下面的第7项进行交换
0x97SWAP8栈顶元素和它下面的第8项进行交换
0x98SWAP9栈顶元素和它下面的第9项进行交换
0x99SWAP10栈顶元素和它下面的第10项进行交换
0x9aSWAP11栈顶元素和它下面的第11项进行交换
0x9bSWAP12栈顶元素和它下面的第12项进行交换
0x9cSWAP13栈顶元素和它下面的第13项进行交换
0x9dSWAP14栈顶元素和它下面的第14项进行交换
0x9eSWAP15栈顶元素和它下面的第15项进行交换
0x9fSWAP16栈顶元素和它下面的第16项进行交换
0xa0LOG0
0xa1LOG1
0xa2LOG1
0xa3LOG3
0xa4LOG4
0xb0PUSH
0xb1DUP
0xb2SWAP
0xf0CREATE
0xf1CALL
0xf2CALLCODE
0xf3RETURN
0xf4DELEGATECALL
0xfaSTATICCALL
0xfdREVERT
0xfeINVALID退出运行,该程序异常
0xffSELFDESTRUCT

bytom:https://github.com/Bytom/bytom/blob/master/protocol/vm/ops.go
hayeah:https://github.com/Bytom/bytom/blob/master/protocol/vm/ops.go

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信