#assembly #push #bytecode #language #evm #assemble #intermediate

bin+lib evmil

An low-level immediate language for compiling to EVM bytecode

28 releases

new 0.4.12 Oct 17, 2024
0.4.6 May 8, 2024
0.4.5 Oct 26, 2023
0.3.2 Apr 27, 2023
0.1.0 Sep 3, 2022

#351 in Magic Beans

Download history 13/week @ 2024-07-01 71/week @ 2024-07-29 9/week @ 2024-09-23 752/week @ 2024-10-14

761 downloads per month

MIT/Apache

285KB
5.5K SLoC

Overview

This is a library and tool for working with EVM bytecode. The tool allows you to disassemble contracts into assembly language, and assemble them back again. The tool also supports a primitive intermediate language which can be compiled into bytecode.

Assembler / Disassembler

To illustrate the tool, we will first disassemble the bytecode contract 0x60006000511161000f5760016000525b. We can do this as follows:

evmil disassemble --code 0x60006000511161000f5760016000525b

This should produce the following output:

.code
        push 0x00
        push 0x00
        mload
        gt
        push 0x000f
        jumpi
        push 0x01
        push 0x00
        mstore
_0x000f:
        jumpdest

If we store this into a file test.asm, we can then assemble it back as follows:

evmil assemble test.asm

And we should see our original bytecode being output:

0x60006000511161000f5760016000525b

Finally, when writing assembly language we can use labels for simplicity. For example, the above could be rewritten as follows:

.code
        push 0x00
        push 0x00
        mload
        gt
        push lab
        jumpi
        push 0x01
        push 0x00
        mstore
lab:
        jumpdest

This just makes writing the assembly language a bit easier.

Dependencies

~4MB
~83K SLoC