【跟小嘉学 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 的 内联汇编

相关推荐
gb4215287几秒前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go7 分钟前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
蒋星熠12 分钟前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
翻滚丷大头鱼36 分钟前
Java 集合Collection—List
java·开发语言
aramae1 小时前
C++ -- 模板
开发语言·c++·笔记·其他
胡耀超1 小时前
4、Python面向对象编程与模块化设计
开发语言·python·ai·大模型·conda·anaconda
索迪迈科技2 小时前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
Zz_waiting.2 小时前
Javaweb - 14.6 - Vue3 数据交互 Axios
开发语言·前端·javascript·vue·axios
萌新小码农‍2 小时前
Java分页 Element—UI
java·开发语言·ui
Tiger_shl2 小时前
【.Net技术栈梳理】03-核心框架与运行时(异常处理)
开发语言·.net