diff --git a/cmd/disasm/main.go b/cmd/evm/disasm.go
similarity index 63%
rename from cmd/disasm/main.go
rename to cmd/evm/disasm.go
index 4ea2dfcba678d864c3762b2993796000994bf529..01a8c60ba9b45c72a3a23f3b74d8df0e85ffcbc1 100644
--- a/cmd/disasm/main.go
+++ b/cmd/evm/disasm.go
@@ -1,4 +1,4 @@
-// Copyright 2015 The go-ethereum Authors
+// Copyright 2017 The go-ethereum Authors
 // This file is part of go-ethereum.
 //
 // go-ethereum is free software: you can redistribute it and/or modify
@@ -14,29 +14,40 @@
 // You should have received a copy of the GNU General Public License
 // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
 
-// disasm is a pretty-printer for EVM bytecode.
 package main
 
 import (
+	"errors"
 	"fmt"
 	"io/ioutil"
-	"os"
-	"strings"
 
 	"github.com/ethereum/go-ethereum/core/asm"
+	cli "gopkg.in/urfave/cli.v1"
+	"strings"
 )
 
-func main() {
-	in, err := ioutil.ReadAll(os.Stdin)
+var disasmCommand = cli.Command{
+	Action:    disasmCmd,
+	Name:      "disasm",
+	Usage:     "disassembles evm binary",
+	ArgsUsage: "<file>",
+}
+
+func disasmCmd(ctx *cli.Context) error {
+	if len(ctx.Args().First()) == 0 {
+		return errors.New("filename required")
+	}
+
+	fn := ctx.Args().First()
+	in, err := ioutil.ReadFile(fn)
 	if err != nil {
-		fmt.Println(err)
-		os.Exit(1)
+		return err
 	}
+
 	code := strings.TrimSpace(string(in[:]))
 	fmt.Printf("%v\n", code)
-	err = asm.PrintDisassembled(code)
-	if err != nil {
-		fmt.Printf("Error: %v\n", err)
-		return
+	if err = asm.PrintDisassembled(code); err != nil {
+		return err
 	}
+	return nil
 }
diff --git a/cmd/evm/main.go b/cmd/evm/main.go
index 5ce45b9ca656c1b4c3a7c42296058ed9462206b4..cc4f8a49c06d475cdba523859d85dd8bf141f125 100644
--- a/cmd/evm/main.go
+++ b/cmd/evm/main.go
@@ -101,6 +101,7 @@ func init() {
 	}
 	app.Commands = []cli.Command{
 		compileCommand,
+		disasmCommand,
 		runCommand,
 	}
 }