asm-lessons/lesson_01/index.md 在主分支 · FFmpeg/asm-lessons

这是关于 FFmpeg 汇编语言的第一课,主要内容如下:

  • 介绍:欢迎来到 FFmpeg 汇编语言学校,此课程将为汇编语言编程打下基础,让你了解计算机内部的运行机制。
  • 所需知识:需掌握 C 语言(特别是指针)和高中数学(标量与向量、加法、乘法等)。
  • 什么是汇编语言:汇编语言直接对应 CPU 处理的指令,可被组装为机器码。FFmpeg 中的大部分汇编代码是 SIMD(单指令多数据),适合处理图像、视频和音频等顺序数据。在 FFmpeg 中,“汇编函数”“SIMD”和“向量(化)”可互换,指用汇编语言编写的一次处理多个数据元素的函数。
  • 为什么使用汇编语言:为了使多媒体处理更快,写汇编代码可获得 10 倍甚至更多的速度提升,节省能源并延长电池寿命。FFmpeg 直接写汇编代码而不使用内联函数,因为内联函数比手写汇编代码慢 10 - 15%,且难以阅读。FFmpeg 中也有因历史原因或特定用例而保留的内联汇编代码,但普遍认为其难以阅读、不受编译器广泛支持且难以维护。同时,有专家称编译器可自动向量化,但实际测试表明手写版本速度更快。
  • 汇编语言的风格:本课聚焦于 x86 64 位汇编语言(也称为 amd64),网上有 AT&T 和 Intel 两种汇编语法风格,本课使用 Intel 语法。
  • 支持材料:书籍和 Stack Overflow 等在线资源对 FFmpeg 汇编语言的参考作用不大,因为 FFmpeg 汇编专注于高性能图像处理。《The Art of 64 - bit assembly》书中关于 SIMD 指令的图表有帮助。有一个 discord 服务器可供提问。
  • 寄存器:寄存器是 CPU 中处理数据的区域,CPU 不直接操作内存,而是将数据加载到寄存器中处理后写回内存。

    • 通用寄存器(GPR):可存储数据或内存地址,在操作系统编程等方面很重要,但在 FFmpeg 汇编中大多作为辅助,其复杂性被抽象掉。
    • 向量寄存器:包含多个数据元素,有 mm、xmm、ymm、zmm 等寄存器,本课主要涉及整数运算,以 xmm 寄存器为例介绍了不同大小的数据表示。
  • x86inc.asm 包含文件:这是 FFmpeg、x264 和 dav1d 中使用的轻量级抽象层,可简化汇编编程,如标记 GPR 等。
  • 简单的标量汇编代码片段:展示了一段简单的标量汇编代码,通过 mov、inc、dec 和 imul 等指令对寄存器进行操作。
  • 理解基本的向量函数:给出了第一个 SIMD 函数的示例,包括函数定义、使用 x86inc.asm 头文件、数据加载(movu)、向量加法(paddb)和数据存储(movu)等操作。

最后提到下一课的链接Next Lesson

阅读 9
0 条评论