Rust Night中提供的新内联程序集语法

2020-06-09 22:33:18

在优化、操作系统或嵌入式开发或其他类型的低级编程过程中,您有时可能需要为您正在运行的处理器编写本机汇编代码。内联汇编提供了一种简单的方法,可以将一些汇编指令集成到Rust程序中,将RustExpression作为输入寄存器提供给RustExpression,并将输出直接输出到RustVariables。我们已经在nighly Rust中引入了一种新的内联汇编语法,我们正在寻求对它的反馈;我们相信这个新语法在未来有一条稳定的道路。

“夜间生锈”具有内联汇编";(ASM!)的语法。然而,在很长一段时间内,这种语法只是暴露了LLVM的AssemblyStructure的一个非常原始的版本,没有任何安全措施来帮助开发人员使用它。获取该语法的任何细节,即使是稍有错误,都会产生内部编译器错误(ICE),而不是您期望从rumstc得到的那种友好的错误消息。这种语法还容易出错的另一个原因是:它看起来类似于GCC的内联汇编语法,但有细微的差异(例如注册约束中的名称)。这种语法在任何非LLVM后端上也几乎没有希望得到支持。由于所有这些限制,ASM!尽管语法是最需要的特性之一,但它不太可能从夜间升级到稳定的生锈状态。

努力改善ASM!并将其带给更多的用户,Amanieud';Antras为ASM!设计并实现了一个新的、更友好的语法。该语法从概念到编译器实现有很长的路要走:

内联汇编成为语言团队的首批项目组之一,并在项目组存储库中迭代设计RFC。

RFC2873(仍在讨论中)为语法及其与Rust语言的交互提供了规范。

我们重命名了现有的ASM!添加到llvm_asm!中,这样每晚使用内联汇编的人现在可以继续使用现有的语法。(我们计划最终删除此语法,因为它很容易受到ICE攻击,但在评估新语法时,我们希望旧语法可供比较和选择。)。

下面是一个使用新的内联汇编语法的示例,在x86-64 Linux上使用直接写入yscall将消息打印到标准输出:

#![Feature(ASM)]fn main(){let buf=";Hello from ASM!\n";;let ret:I32;unsafe{asm!(";syscall";,in(";rax";)1,//syscall number in(";RDI";)1,//FD(Stdout)in(";RSI";)。)buf.len(),out(";rcx";)_,//被syscalls out(";r11";)_,//被syscalls lateout(";rax";)ret,);}println!(";write return:{}";,ret);}