8 个版本

0.0.9 2024年6月27日
0.0.8 2024年6月10日
0.0.7 2023年10月26日

#2717 in 魔法豆

Download history 2/week @ 2024-04-19 104/week @ 2024-06-07 15/week @ 2024-06-14 88/week @ 2024-06-21 42/week @ 2024-06-28 18/week @ 2024-07-05

496 每月下载量

MIT/Apache

140KB
3.5K SLoC

everscale-asm   crates-io-batch docs-badge rust-version-badge workflow-badge

状态:进行中

关于

TVM 汇编器的 Rust 实现。

LSP 服务器/客户端

  • 安装 TVM Assembler VSCode 扩展
  • 安装 CLI
    cargo install --locked tvmasm
    

使用方法

使用 CLI 构建合约

tvmasm build ./src/tests/walletv3.tvm -o walletv3.boc

输出

Code path:      walletv3.boc
Code hash:      84dafa449f98a6987789ba232358072bc0f76dc4524002a5d0918b9a75d2d599
Unique cells:   1
Unique bits:    888

从 Rust 构建合约

运行时

use everscale_asm::Code;
use everscale_types::prelude::Cell;

let code: Cell = Code::assemble(r#"
    PUSHINT 1
    SWAP DUP
    PUSHCONT {
        TUCK
        MUL
        SWAP
        DEC
    }
    REPEAT
    DROP
"#)?;

编译时间

use everscale_asm_macros::tvmasm;
use everscale_types::prelude::{Boc, Cell};

const CODE: &[u8] = tvmasm!(
    "PUSHINT 1",
    "PUSHCONT { INC PUSHINT 10 LESS }",
    "PUSHCONT { DUMPSTK }",
    "WHILE",
);

let code: Cell = Boc::decode(CODE)?;

语法

// Single-line comments

// Opcodes must be in uppercase, can start with a digit or minus,
// and can contain '#' or '_'
NOP
2DROP
-ROT
STREF_L

// Opcodes with number as an argument
PUSHINT 12
PUSHINT -0xded
PUSHINT 0b10110101

// Opcodes with stack register as an argument
PUSH s1
XCHG s10, s100
PU2XC s1, s(-1), s(-2)

// Opcodes with control registers (c0, .., c5, c7)
PUSH c3
PUSHCTR c7

// Opcodes with slice or continuation
PUSHSLICE x{123123_}
PUSHSLICE b{10001001}
IFREFELSEREF {
  PUSHINT 1
}, {
  PUSHINT 2
}

// Insert raw slices into code
@inline x{a924}

完整的操作码列表

贡献

我们欢迎对项目的贡献!如果您发现任何问题或错误,请随时提出问题或提交拉取请求。

许可证

根据您的选择,许可为以下之一

依赖关系

~14–27MB
~394K SLoC