Linux操作系统中x86的内联汇编(2)

分类: 设备驱动   出处:iocblog整理  更新时间:2008-12-02   添加到收藏  

  本例中,汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 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 来源]

上一页 [1] [2]


Tag: 汇编



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。