go-ethereum/core/asm.go

51 lines
1.2 KiB
Go
Raw Normal View History

2014-12-04 11:28:02 +02:00
package core
import (
"fmt"
"math/big"
2015-03-16 12:27:38 +02:00
"github.com/ethereum/go-ethereum/common"
2014-11-01 02:18:03 +02:00
"github.com/ethereum/go-ethereum/vm"
)
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!)
2014-11-01 02:18:03 +02:00
op := vm.OpCode(val)
2014-06-26 12:25:43 +03:00
asm = append(asm, fmt.Sprintf("%04v: %v", pc, op))
switch op {
2014-11-01 02:18:03 +02:00
case vm.PUSH1, vm.PUSH2, vm.PUSH3, vm.PUSH4, vm.PUSH5, vm.PUSH6, vm.PUSH7, vm.PUSH8,
vm.PUSH9, vm.PUSH10, vm.PUSH11, vm.PUSH12, vm.PUSH13, vm.PUSH14, vm.PUSH15,
vm.PUSH16, vm.PUSH17, vm.PUSH18, vm.PUSH19, vm.PUSH20, vm.PUSH21, vm.PUSH22,
vm.PUSH23, vm.PUSH24, vm.PUSH25, vm.PUSH26, vm.PUSH27, vm.PUSH28, vm.PUSH29,
vm.PUSH30, vm.PUSH31, vm.PUSH32:
2015-03-16 12:27:38 +02:00
pc.Add(pc, common.Big1)
2014-11-01 02:18:03 +02:00
a := int64(op) - int64(vm.PUSH1) + 1
2014-07-11 17:04:09 +03:00
if int(pc.Int64()+a) > len(script) {
return
2014-07-11 17:04:09 +03:00
}
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-26 12:25:43 +03:00
asm = append(asm, fmt.Sprintf("%04v: 0x%x", pc, data))
2014-05-08 15:20:06 +03:00
pc.Add(pc, big.NewInt(a-1))
}
2015-03-16 12:27:38 +02:00
pc.Add(pc, common.Big1)
}
return asm
}