Skip to content

Instantly share code, notes, and snippets.

@gcolvin
Last active September 26, 2017 07:49
Show Gist options
  • Save gcolvin/1654c4c88518a4372926f0db39ca09a5 to your computer and use it in GitHub Desktop.
Save gcolvin/1654c4c88518a4372926f0db39ca09a5 to your computer and use it in GitHub Desktop.
stupid simple EVM assembler
// For example take this code
// XPUSH(1,1) ff
// XPUSH(1,1) ee
// XAND(1,1)
// run it through the preprocessor and tr
// gcc -E -P -x c-header -include masm.h test.evm | tr -d [:space:]
// and get this output
// e011ffe011eed611
// Haven't figured out labels yet, might have to just count.
// No, this is not suitable for real work, but will suffice
// for initial testing, and was easy to write.
#define STOP 00
#define ADD 01
#define MUL 02
#define SUB 03
#define DIV 04
#define SDIV 05
#define MOD 06
#define SMOD 08
#define ADDMOD 09
#define MULMOD 0a
#define EXP 0b
#define SIGNEXTEND 0c
#define LT 10
#define GT 11
#define SLT 12
#define SGT 13
#define EQ 14
#define ISZERO 15
#define AND 16
#define OR 17
#define XOR(n,sz) 18
#define NOT 19
#define BYTE 20
#define SHL 21
#define SHR 22
#define SAR 23
#define SHA3 20
#define ADDRESS 30
#define BALANCE 31
#define ORIGIN 32
#define CALLER 33
#define CALLVALUE 34
#define CALLDATALOAD 35
#define CALLDATASIZE 36
#define CALLDATACOPY 37
#define CODESIZE 38
#define CODECOPY 39
#define GASPRICE 3a
#define EXTCODESIZE 3b
#define EXTCODECOPY 3c
#define RETURNDATASIZE 3d
#define RETURNDATACOPY 3e
#define BLOCKHASH 40
#define COINBASE 41
#define TIMESTAMP 42
#define NUMBER 43
#define DIFFICULTY 44
#define GASLIMIT 45
#define POP 50
#define MLOAD 51
#define MSTORE 52
#define MSTORE8 53
#define SLOAD 54
#define SSTORE 55
#define JUMP 56
#define JUMPI 57
#define PC 58
#define MSIZE 59
#define GAS 5a
#define JUMPDEST 5b
#define PUSH1(bytes) 60 bytes
#define PUSH2(bytes) 61 bytes
#define PUSH3(bytes) 62 bytes
#define PUSH4(bytes) 63 bytes
#define PUSH5(bytes) 64 bytes
#define PUSH6(bytes) 65 bytes
#define PUSH7(bytes) 66 bytes
#define PUSH8(bytes) 67 bytes
#define PUSH9(bytes) 68 bytes
#define PUSH10(bytes) 69 bytes
#define PUSH11(bytes) 6a bytes
#define PUSH12(bytes) 6b bytes
#define PUSH13(bytes) 6c bytes
#define PUSH14(bytes) 6d bytes
#define PUSH15(bytes) 6e bytes
#define PUSH16(bytes) 6f bytes
#define PUSH17(bytes) 70 bytes
#define PUSH18(bytes) 71 bytes
#define PUSH19(bytes) 72 bytes
#define PUSH20(bytes) 73 bytes
#define PUSH21(bytes) 74 bytes
#define PUSH22(bytes) 75 bytes
#define PUSH23(bytes) 76 bytes
#define PUSH24(bytes) 77 bytes
#define PUSH25(bytes) 78 bytes
#define PUSH26(bytes) 79 bytes
#define PUSH27(bytes) 7a bytes
#define PUSH28(bytes) 7b bytes
#define PUSH29(bytes) 7c bytes
#define PUSH30(bytes) 7d bytes
#define PUSH31(bytes) 7e bytes
#define PUSH32(bytes) 7f bytes
#define DUP1 80
#define DUP2 81
#define DUP3 82
#define DUP4 83
#define DUP5 84
#define DUP6 85
#define DUP7 86
#define DUP8 87
#define DUP9 88
#define DUP10 89
#define DUP11 8a
#define DUP12 8b
#define DUP13 8c
#define DUP14 8d
#define DUP15 8e
#define DUP16 8f
#define SWAP1 90
#define SWAP2 91
#define SWAP3 92
#define SWAP4 93
#define SWAP5 94
#define SWAP6 95
#define SWAP7 96
#define SWAP8 97
#define SWAP9 98
#define SWAP10 99
#define SWAP11 9a
#define SWAP12 95
#define SWAP13 9c
#define SWAP14 9d
#define SWAP15 9e
#define SWAP16 9f
#define LOG0 a0
#define LOG1 a1
#define LOG2 a2
#define LOG3 a3
#define LOG4 a4
#define JUMPTO b0
#define JUMPIF b1
#define JUMPSUB b2
#define JUMPV b3
#define JUMPSUBV b4
#define BEGINSUB b5
#define BEGINDATA b6
#define RETURNSUB b7
#define PUTLOCAL b8
#define GETLOCAL b9
#define XADD(n,sz) c1 n sz
#define XMUL(n,sz) c2 n sz
#define XSUB(n,sz) c3 n sz
#define XDIV(n,sz) c4 n sz
#define XSDIV(n,sz) c5 n sz
#define XMOD(n,sz) c6 n sz
#define XSMOD(n,sz) c7 n sz
#define XLT(n,sz) d0 n sz
#define XGT(n,sz) d1 n sz
#define XSLT(n,sz) d2 n sz
#define XSGT(n,sz) d3 n sz
#define XEQ(n,sz) d4 n sz
#define XISZERO(n,sz) d5 n sz
#define XAND(n,sz) d6 n sz
#define XOOR(n,sz) d7 n sz
#define XXOR(n,sz) d8 n sz
#define XNOT(n,sz) d9 n sz
#define XSHL(n,sz) db n sz
#define XSHR(n,sz) dc n sz
#define XSAR(n,sz) dd n sz
#define XROL(n,sz) de n sz
#define XROR(n,sz) df n sz
#define XPUSH(n,sz) e0 n sz
#define XMLOAD(n,sz) e1 n sz
#define XMSTORE(n,sz) e2 n sz
#define XPOP(n,sz) e3 n sz
#define XSLOAD(n,sz) e4 n sz
#define XSSTORE(n,sz) e5 n sz
#define XVTOWIDE(n,sz) e6 n sz
#define XWIDETOV(n,sz) e7 n sz
#define XGET(n,sz) e8 n sz
#define XPUT(n,sz) e9 n sz
#define XSWIZZLE(n,sz) ea n sz
#define XSHUFFLE(n,sz) eb n sz
#define XSCATTER(n,sz) ec n sz
#define XGATHER(n,sz) ed n sz
#define CREATE f0
#define CALL f1
#define CALLCODE f2
#define RETURN f3
#define DELEGATECALL f4
#define STATICCALL fa
#define CREATE2 fb
#define REVERT fd
#define INVALID fe
#define SUICIDE ff
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment