导航:首页 > 源码编译 > 编译器内联

编译器内联

发布时间:2025-05-01 11:14:19

❶ 内联汇编的GNU 汇编程序简述

Linux 中使用的基本汇编程序语法。GCC(用于 Linux 的 GNU C 编译器)使用 AT&T 汇编语法。下面列出了这种语法的一些基本规则。 asm ( assembler template
: output operands (optional)
: input operands (optional)
: list of clobbered registers
(optional)
);
本例中,汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 C 表达式。输出操作数是将对其执行汇编指令输出的 C 表达式。
内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 C 变量显示出来。因为它具有这种能力,所以 asm 可以用作汇编指令和包含它的 C 程序之间的接口。
一个非常基本但很重要的区别在于 简单内联汇编只包括指令,而 扩展内联汇编包括操作数。要说明这一点,考虑以下示例: { int a=10, b; asm (movl %1, %%eax; movl %%eax, %0; :=r(b) /* output */ :r(a) /* input */ :%eax); /* clobbered register */}
在上例中,我们使用汇编指令使 b 的值等于 a。请注意以下几点:
b 是输出操作数,由 %0 引用,a 是输入操作数,由 %1 引用。 r 是操作数的约束,它指定将变量 a 和 b 存储在寄存器中。请注意,输出操作数约束应该带有一个约束修饰符 =,指定它是输出操作数。 要在 asm 内使用寄存器 %eax,%eax 的前面应该再加一个 %,换句话说就是 %%eax,因为 asm 使用 %0、%1 等来标识变量。任何带有一个 % 的数都看作是输入/输出操作数,而不认为是寄存器。 第三个冒号后的修饰寄存器 %eax 告诉将在 asm 中修改 GCC %eax 的值,这样 GCC 就不使用该寄存器存储任何其它的值。 movl %1, %%eax 将 a 的值移到 %eax 中, movl %%eax, %0 将 %eax 的内容移到 b 中。 因为 b 被指定成输出操作数,因此当 asm 的执行完成后,它将反映出更新的值。换句话说,对 asm 内 b 所做的更改将在 asm 外反映出来。

阅读全文

与编译器内联相关的资料

热点内容
景德镇云服务器大概费用 浏览:362
程序员按公司要求开发软件 浏览:593
链接加密跳转 浏览:253
android设置dialog宽度 浏览:965
程序员能学钢琴吗 浏览:906
单片机木头 浏览:134
服务器恢复正常了怎么办 浏览:429
网易云游戏ios怎么玩安卓渠道服 浏览:317
算法时间复杂度可表示为 浏览:286
投标文件加密文件内存太大 浏览:584
初中习题库哪个app好用 浏览:688
caxa编程助手23 浏览:20
python函数封装加减乘除 浏览:553
加密基础建设 浏览:663
安卓手机如何开到极限帧 浏览:65
mysql命令中文 浏览:757
程序员leetcode教学 浏览:921
哪里有红尘直播app下载 浏览:181
诗经注音pdf 浏览:782
pdfxchange下载 浏览:507