Linux操作系统中x86的内联汇编(2)
本例中,汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 c 表达式。输出操作数是将对其执行汇编指令输出的 c 表达式。
内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 c 变量显示出来。因为它具有这种能力,所以 "asm" 可以用作汇编指令和包含它的 c 程序之间的接口。
一个非常基本但很重要的区别在于 简单内联汇编只包括指令,而 扩展内联汇编包括操作数。要说明这一点,考虑以下示例:
内联汇编的基本要素
{
int a=10, b;
asm ("movl %1, %%eax;
movl %%eax, %0;"[iocblog.net 来源]
:"=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" 外反映出来。
[iocblog.net 来源]
Tag: 汇编
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。