go-ethereum/ethchain/asm.go

41 lines
954 B
Go
Raw Normal View History

package ethchain
import (
"fmt"
"github.com/ethereum/eth-go/ethutil"
"math/big"
)
func Disassemble(script []byte) (asm []string) {
pc := new(big.Int)
for {
if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 {
return
}
// Get the memory location of pc
val := script[pc.Int64()]
// Get the opcode (it must be an opcode!)
op := OpCode(val)
asm = append(asm, fmt.Sprintf("%v", op))
switch op {
2014-05-28 13:03:12 +03:00
case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:
pc.Add(pc, ethutil.Big1)
2014-05-28 13:03:12 +03:00
a := int64(op) - int64(PUSH1) + 1
2014-05-08 15:20:06 +03:00
data := script[pc.Int64() : pc.Int64()+a]
2014-06-13 13:45:11 +03:00
if len(data) == 0 {
data = []byte{0}
}
2014-06-18 01:25:58 +03:00
asm = append(asm, fmt.Sprintf("0x%x", data))
2014-05-08 15:20:06 +03:00
pc.Add(pc, big.NewInt(a-1))
}
pc.Add(pc, ethutil.Big1)
}
return
}