#汇编 #标记 #转换 #生成 #底层 #标记化 #模块

bin+lib 海绵

一个强大的Rust模块,用于将Rust代码转换为ASM

2个版本

0.2.1 2024年6月20日
0.2.0 2024年6月20日

#942 in 解析实现

每月 35 次下载

MIT 许可证

40KB
117

海绵

海绵是一个强大的Rust模块,旨在将Rust代码转换为汇编语言(ASM)。它将Rust代码标记化,解析标记,并生成相应的汇编代码,使您能够更容易地理解和优化Rust程序在汇编级别的性能。

描述

海绵旨在弥合高级Rust代码与低级汇编代码之间的差距。通过将Rust代码转换为ASM,开发者可以深入了解他们的Rust代码如何转换为机器指令,这对性能优化和学习都非常有价值。

特性

  • 标记化:将Rust代码分解为标记。
  • 解析:将标记转换为结构化格式。
  • ASM生成:从解析的标记生成等效的汇编代码。
  • 可定制输出:允许根据特定需求定制汇编代码生成。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
sponge = "0.2.0"

运行 cargo build 以安装依赖项。

使用方法

海绵可以以多种方式使用,以满足您的需求。您可以使用它来标记化Rust代码、解析标记或生成ASM代码。

标记化Rust代码

要标记化Rust文件

extern crate sponge;

use sponge::decompose_tokens::decompose;

fn main() {
    let filename = "script.rs";
    match decompose(filename) {
        Ok(tokens) => println!("{:?}", tokens),
        Err(e) => eprintln!("Error: {}", e),
    }
}

解析标记

要将标记解析为结构化格式

extern crate sponge;

use sponge::decompose_tokens::decompose;
use sponge::parse_tokens::parse;

fn main() {
    let filename = "script.rs";
    match decompose(filename) {
        Ok(tokens) => {
            let parsed_tokens = parse(tokens);
            println!("{:?}", parsed_tokens);
        },
        Err(e) => eprintln!("Error: {}", e),
    }
}

生成ASM代码

要从解析的标记生成ASM代码

extern crate sponge;

use sponge::decompose_tokens::decompose;
use sponge::parse_tokens::parse;
use sponge::generate_asm::generate;

fn main() {
    let filename = "script.rs";
    match decompose(filename) {
        Ok(tokens) => {
            let parsed_tokens = parse(tokens);
            let asm_code = generate(&parsed_tokens);
            println!("{}", asm_code);
        },
        Err(e) => eprintln!("Error: {}", e),
    }
}

使用命令行界面

海绵还提供了一个简单的CLI来简化转换过程。可用的选项包括

  • -i, --input <文件>:指定输入Rust文件。
  • -o, --output <文件>:指定输出ASM文件。

示例

  1. 创建一个Rust文件(script.rs),内容如下

    fn main() {
        let REG_1: i32 = 50;
    }
    
  2. 在您的终端中运行以下命令以生成ASM代码

    sponge -i script.rs -o script.asm
    

    这将生成 script.asm 文件

    section .data
    
    section .bss
    
    section .text
        global _start
    
    _start:
        mov r1, 50         ; Move the value 50 into register 1
    
        ; Exit the program
        mov rax, 60        ; System call for exit
        xor rdi, rdi       ; Exit code 0
        syscall            ; Invoke the system call
    

贡献

我们欢迎对 Sponge 的贡献!以下是您可以如何帮助的方式

  1. 创建仓库的分支。
  2. 创建一个新的分支(使用以下命令:git checkout -b feature-branch)。
  3. 提交您的更改(使用以下命令:git commit -am '添加新功能')。
  4. 推送到分支(使用以下命令:git push origin feature-branch)。
  5. 创建一个新的拉取请求。

请确保您的代码遵循项目编码标准,并包括适当的测试。

许可证

本项目采用 MIT 许可证 - 有关详细信息,请参阅 LICENSE 文件。

联系方式

如有任何疑问或问题,请联系 Bradinator,邮箱:[email protected]

鸣谢

特别感谢所有贡献者和 Rust 社区对他们的支持和贡献。

依赖项

~1.6–2.7MB
~52K SLoC