如何用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
相关产品推荐
相关产品推荐

