内联汇编

更新时间:2024-05-21 11:00

内联汇编,指在C语言中插入汇编语言,其是Linux中使用的基本汇编程序语法。

名词概念

在C语言中可以插入汇编语言。

汇编语法

Linux 中使用的基本汇编程序语法。GCC(用于 Linux 的 GNU C 编译器)使用 AT&T 汇编语法。下面列出了这种语法的一些基本规则。

寄存器命名

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

操作数的顺序

在所有指令中,先是源操作数,然后才是目的操作数。这与将源操作数放在目的操作数之后的 Intel 语法不同。

操作数大小

根据操作数是字节 (byte)、字 (word) 还是长型 (long),指令的后缀可以是 b、w 或 l。这并不是强制性的;GCC 会尝试通过读取操作数来提供相应的后缀。但手工指定后缀可以改善代码的可读性,并可以消除编译器猜测不正确的可能性。

立即操作数

通过使用 $ 指定直接操作数。

间接内存引用

任何对内存的间接引用都是通过使用 ( ) 来完成的。

特殊结构

GCC 为内联汇编提供特殊结构,它具有以下格式:

asm assembler template

: output operands (optional)

: input operands (optional)

: list of clobbered registers

(optional);

本例中,汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 C 表达式。输出操作数是将对其执行汇编指令输出的 C 表达式

汇编指令和包含它的 C 程序之间的接口。

一个非常基本但很重要的区别在于 简单内联汇编只包括指令,而 扩展内联汇编包括操作数。要说明这一点,考虑以下示例:

内联汇编的基本要素

操作数寄存器中。请注意,输出操作数寄存器变量。任何带有一个 % 的数都看作是输入/输出操作数,而不认为是寄存器。 第三个冒号后的修饰寄存器存储操作数

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}