【跟小嘉学 Rust 编程】二十四、内联汇编(inline assembly)

系列文章目录

【跟小嘉学 Rust 编程】一、Rust 编程基础
【跟小嘉学 Rust 编程】二、Rust 包管理工具使用
【跟小嘉学 Rust 编程】三、Rust 的基本程序概念
【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念
【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据
【跟小嘉学 Rust 编程】六、枚举和模式匹配
【跟小嘉学 Rust 编程】七、使用包(Packages)、单元包(Crates)和模块(Module)来管理项目
【跟小嘉学 Rust 编程】八、常见的集合
【跟小嘉学 Rust 编程】九、错误处理(Error Handling)
【跟小嘉学 Rust 编程】十一、编写自动化测试
【跟小嘉学 Rust 编程】十二、构建一个命令行程序
【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包
【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io
【跟小嘉学 Rust 编程】十五、智能指针(Smart Point)
【跟小嘉学 Rust 编程】十六、无畏并发(Fearless Concurrency)
【跟小嘉学 Rust 编程】十七、面向对象语言特性
【跟小嘉学 Rust 编程】十八、模式匹配(Patterns and Matching)
【跟小嘉学 Rust 编程】十九、高级特性
【跟小嘉学 Rust 编程】二十、进阶扩展
【跟小嘉学 Rust 编程】二十一、网络编程
【跟小嘉学 Rust 编程】二十三、Cargo 使用指南
【跟小嘉学 Rust 编程】二十四、内联汇编(inline assembly)

### 文章目录

  • [系列文章目录](#文章目录 系列文章目录 @TOC 前言 一、 内联汇编(Inline Assembly) 1.1、asm! 1.2、asm 宏的参数 总结)
  • [@TOC(文章目录)](#文章目录 系列文章目录 @TOC 前言 一、 内联汇编(Inline Assembly) 1.1、asm! 1.2、asm 宏的参数 总结)
  • [前言](#文章目录 系列文章目录 @TOC 前言 一、 内联汇编(Inline Assembly) 1.1、asm! 1.2、asm 宏的参数 总结)
  • [一、 内联汇编(Inline Assembly)](#文章目录 系列文章目录 @TOC 前言 一、 内联汇编(Inline Assembly) 1.1、asm! 1.2、asm 宏的参数 总结)
  • [1.1、asm!](#文章目录 系列文章目录 @TOC 前言 一、 内联汇编(Inline Assembly) 1.1、asm! 1.2、asm 宏的参数 总结)
  • [1.2、asm 宏的参数](#文章目录 系列文章目录 @TOC 前言 一、 内联汇编(Inline Assembly) 1.1、asm! 1.2、asm 宏的参数 总结)
  • [总结](#文章目录 系列文章目录 @TOC 前言 一、 内联汇编(Inline Assembly) 1.1、asm! 1.2、asm 宏的参数 总结)

前言

Rust 在 1.59 版本之中,引入了内联汇编支持,该特性对于需要底层控制的应用非常有用,例如想要控制底层执行、访问特定的机器指令等。

主要教材参考 《The Rust Programming Language》
主要教材参考 《Rust For Rustaceans》
主要教材参考 《The Rustonomicon》
主要教材参考 《Rust 高级编程》
主要教材参考 《Cargo 指南》


一、 内联汇编(Inline Assembly)

1.1、asm!

使用 asm! 和 global_asm! 宏, 内联汇编使用的汇编语言和指令取决于相应的机器平台,目前为止 Rust 支持以下平台的内联汇编

  • x86 和 x86-64
  • ARM
  • AArch64
  • RISC-V
  • LoongArch

如果不支持,asm! 宏将会触发一个 error。

rust 复制代码
use std::arch::asm;

// Multiply x by 6 using shifts and adds
let mut x: u64 = 4;
unsafe {
    asm!(
        "mov {tmp}, {x}",
        "shl {tmp}, 1",
        "shl {x}, 2",
        "add {x}, {tmp}",
        x = inout(reg) x,
        tmp = out(reg) _,
    );
}
assert_eq!(x, 4 * 6);

1.2、asm 宏的参数

这些参数为了让编译器帮助分配寄存器

  • in:表示将变量值传给寄存器
  • out :表示将寄存器的值写到变量
  • inout: 即时输入也是输出,这种方式可以保证同一个寄存器来完成任务
  • lateout:任何只在所有输入被消费后才被写入的输出
  • inlateout:输出值在所有寄存器被读取后,才被修改;
  • sym: asm可以将符号重定位集合起来从线程本地数据中读取

具体内容,我们会放到 Rust 嵌入式讲解 这部分,目前不是我们系列的重点内容

总结

以上内容就是讲解了 Rust 的 内联汇编

相关推荐
1024奇点8 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch9 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
Knight_AL10 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing0310 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by2099911 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河11 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮11 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻11 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble11 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
码流子12 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构