GCC 内联汇编 HOWTO

    xiaoxiao2024-05-16  109

    v0.1, 01 March 2003.

    本 HOWTO 文档将讲解 GCC 提供的内联汇编特性的用途和用法。对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86 汇编语言和 C 语言的基本认识。

    1. 简介

    1.1 版权许可

    Copyright (C) 2003 Sandeep S.

    本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本。

    发布这篇文档是希望它能够帮助别人,但是没有任何担保;甚至不包括可售性和适用于任何特定目的的担保。关于更详细的信息,可以查看 GNU 通用许可证。

    1.2 反馈校正

    请将反馈和批评一起提交给 Sandeep.S 。我将感谢任何一个指出本文档中错误和不准确之处的人;一被告知,我会马上改正它们。

    1.3 致谢

    我对提供如此棒的特性的 GNU 人们表示真诚的感谢。感谢 Mr.Pramode C E 所做的所有帮助。感谢在 Govt Engineering College 和 Trichur 的朋友们的精神支持和合作,尤其是 Nisha Kurur 和 Sakeeb S 。 感谢在 Gvot Engineering College 和 Trichur 的老师们的合作。

    另外,感谢 Phillip , Brennan Underwood 和 colin@nyx.net ;这里的许多东西都厚颜地直接取自他们的工作成果。

    2. 概览

    在这里,我们将学习 GCC 内联汇编。这里内联inline表示的是什么呢?

    我们可以要求编译器将一个函数的代码插入到调用者代码中函数被实际调用的地方。这样的函数就是内联函数。这听起来和宏差不多?这两者确实有相似之处。

    内联函数的优点是什么呢?

    这种内联方法可以减少函数调用开销。同时如果所有实参的值为常量,它们的已知值可以在编译期允许简化,因此并非所有的内联函数代码都需要被包含进去。代码大小的影响是不可预测的,这取决于特定的情况。为了声明一个内联函数,我们必须在函数声明中使用 inline 关键字。

    现在我们正处于一个猜测内联汇编到底是什么的点上。它只不过是一些写为内联函数的汇编程序。在系统编程上,它们方便、快速并且极其有用。我们主要集中学习(GCC)内联汇编函数的基本格式和用法。为了声明内联汇编函数,我们使用 asm 关键词。

    内联汇编之所以重要,主要是因为它可以操作并且使其输出通过 C 变量显示出来。正是因为此能力, "asm" 可以用作汇编指令和包含它的 C 程序之间的接口。

    3. GCC 汇编语法

    Linux上的 GNU C 编译器 GCC ,使用 AT&T / UNIX 汇编语法。在这里,我们将使用 AT&T 语法 进行汇编编码。如果你对 AT&T 语法不熟悉的话,请不要紧张,我会教你的。AT&T 语法和 Intel 语法的差别很大。我会给出主要的区别。

    源操作数和目的操作数顺序

    AT&T 语法的操作数方向和 Intel 语法的刚好相反。在Intel 语法中,第一操作数为目的操作数,第二操作数为源操作数,然而在 AT&T 语法中,第一操作数为源操作数,第二操作数为目的操作数。也就是说,

    Intel 语法中的 Op-code dst src 变为 AT&T 语法中的 Op-code src dst。

    寄存器命名

    寄存器名称有 % 前缀,即如果必须使用 eax,它应该用作 

    转载请注明原文地址: https://yun.8miu.com/read-127595.html
    最新回复(0)