You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Cargo/Rustc离线生成Rust代码的简洁对比汇编?

如何用Rust命令行工具离线生成简洁的汇编代码用于对比?

要离线生成类似Godbolt的无样板、易对比的汇编代码,直接用rustc自带的编译参数就能实现,具体步骤如下:

1. 准备代码文件

将需要对比的函数保存为库文件,比如src/lib.rs,内容示例:

pub fn range_north(sq: u8) -> impl Iterator<Item = u8> {
    (sq..=(sq | 0b111000)).step_by(8)
}

pub fn range_north2(sq: u8) -> impl Iterator<Item = u8> {
    let (rk, fl) = (sq / 8, sq % 8);
    let n = 8 - rk;
    (sq..=63).step_by(8).take(n as usize)
}

2. 编译生成优化后的简洁汇编

使用以下命令直接在终端输出无冗余的汇编代码:

rustc -O --crate-type=lib --emit=asm --asm-comment-style=none src/lib.rs -o -

参数说明:

  • -O:开启最高级别优化(等价于-O2),和Godbolt默认优化策略一致
  • --crate-type=lib:编译为库文件,避免生成二进制程序的启动样板代码
  • --emit=asm:指定输出汇编格式
  • --asm-comment-style=none:移除自动生成的注释,让汇编更简洁
  • -o -:将输出定向到终端,而非生成本地文件

3. 过滤目标函数(可选)

如果只关注特定函数,用grep过滤输出:

rustc -O --crate-type=lib --emit=asm --asm-comment-style=none src/lib.rs -o - | grep -A 15 'example::range_north\|example::range_north2'

-A 15表示显示匹配行之后的15行,可根据函数实际长度调整数字。

执行后会得到和你示例中几乎一致的汇编:

example::range_north:
        mov     rax, rdi
        movzx   ecx, sil
        or      sil, 56
        movzx   edx, sil
        shl     edx, 8
        or      edx, ecx
        mov     word ptr [rdi + 8], dx
        mov     word ptr [rdi + 10], 256
        mov     qword ptr [rdi], 7
        ret

example::range_north2:
        mov     rax, rdi
        movzx   ecx, sil
        shr     sil, 3
        mov     dl, 8
        sub     dl, sil
        or      ecx, 16128
        movzx   edx, dl
        mov     qword ptr [rdi], 7
        mov     word ptr [rdi + 8], cx
        mov     word ptr [rdi + 10], 256
        mov     qword ptr [rdi + 16], rdx
        ret

4. 保存汇编到文件(可选)

若要将汇编保存到本地文件,去掉-o -参数即可,rustc会自动生成与crate同名的.s文件:

rustc -O --crate-type=lib --emit=asm --asm-comment-style=none src/lib.rs

生成的example.s文件中包含所有函数的汇编代码,直接打开查看即可。

内容的提问来源于stack exchange,提问作者user1002430

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:25:19