Linux GCC内联汇编 常用 constraints

原创 2011年03月05日 11:55:00

 

有很多 constraints,但是常用的只有少数。下面我们就来看下这些限制条件。

1. 寄存器操作数限制条件: r

如果操作数指定了这个限制,操作数将使用通用寄存器来存储。看下面的例子:

asm ( “movl %%eax, %0” : “=r” (myval));

变量 myval 被保存在一个寄存器中,eax 中的值被拷贝到这个寄存器中,并且在内存中的
myval 的值也会按这个寄存器值被更新。当 constraints ”r” 被指定时,GCC 可能在任何一个
可用的通用寄存器中保存这个值。当然如果你要指定具体使用那个寄存器就要指定具体使
用哪个寄存器的 constraints。
2. 内存操作数 constraint: m
当操作数在内存中时,任何对其操作将直接通过内存地址进行。和寄存器 constraint 相反,
内存操作是先把值存在一个寄存器中,修改后再将值回写到这个内存地址。寄存器
constraint 通常只用在对速度要求非常严格的场合。因为内存 constraint 可以更有效率的将
一个 C 语言变量在 asm 中跟新[不需要寄存器中转],而且可能你也不想用一个寄存器来暂
存这个变量的值。例如:
asm (“sidt” %0” : : “m”(loc) );
3. 匹配 constraint
其他 constraint
1. “m”: 使用一个内存操作数,内存地址可以是机器支持的范围内。
2. “o”: 使用一个内存操作数,但是要求内存地址范围在在同一段内 。例如,加上一个小
的偏移量来形成一个可用的地址。
3. “V”: 内存操作数,但是不在同一个段内。换句话说,就是使用”m”的所有的情况除了”o”
4. “i”: 使用一个立即整数操作数(值固定);也包含仅在编译时才能确定其值的符号常量。
5. “n”: 一个确定值的立即数。很多系统不支持汇编时常数操作数小于一个字。这时候使
用 n 就比使用 i 好。
6. “g”: 除了通用寄存器以外的任何寄存器,内存和立即整数。

下面的是 x86 特有的 constraint:
"r" : Register operand constraint, look table given above.
"q" : Registers a, b, c or d.
"I" : Constant in range 0 to 31 (for 32-bit shifts).
"J" : Constant in range 0 to 63 (for 64-bit shifts).
"K" : 0xff.
"L" : 0xffff.
"M" : 0, 1, 2, or 3 (shifts for lea instruction).
"N" : Constant in range 0 to 255 (for out instruction).
"f" : Floating point register
"t" : First (top of stack) floating point register
"u" : Second floating point register
"A" : Specifies the `a’ or `d’ registers. This is primarily useful for 64-bit integer values intended to be
returned with the `d’ register holding the most significant bits and the `a’ register holding the least
significant bits.

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

GCC内联汇编基础 V2 (修改版)

  • 2008年12月24日 12:07
  • 537KB
  • 下载

GCC内联汇编入门(中文版)

  • 2008年12月21日 16:13
  • 124KB
  • 下载

Zephyr OS 番外篇: ARM GCC 内联汇编参考手册

不可多得的好资料,详细介绍内联汇编的基本语法

gcc内联汇编手册

  • 2012年01月10日 21:32
  • 93KB
  • 下载

gcc 内联汇编用法介绍

前言大部分内容翻译提取自某国外HOW-TO文档,原地址: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html AT&T汇...

GCC 内联汇编约束字符"m"的用法

​首先是这么一段代码(例一)​: #include void main() { char c; //int tmp; char *s="abcdefg"; asm("...

ARM嵌入式开发中的GCC内联汇编__asm__

在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择。但如果完全通过汇编代码实现,又会过于复杂、难以调试。因此,C语言内嵌汇编的方式...
  • comwise
  • comwise
  • 2013年08月25日 19:43
  • 1134

Android漫游记(5)---ARM GCC 内联汇编烹饪书(附实例分析)

关于本文档 GNU C编译器针对ARM RISC处理器,提供了内联汇编支持。利用这一非常酷炫的特性,我们可以用来优化软件代码中的关键部分,或者可以使用针对特定处理的汇编处理指令。 ...

GCC扩展内联汇编关于寄存器的一点问题

源码: #include #include int main() { int result = 0; int input = 1; __asm__ __volatile_...

ARM嵌入式开发中的GCC内联汇编简介

ARM嵌入式开发中的GCC内联汇编简介 嵌入式开发交流群280352802,欢迎加入! 在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为...
  • atpccb
  • atpccb
  • 2016年09月24日 11:30
  • 199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux GCC内联汇编 常用 constraints
举报原因:
原因补充:

(最多只允许输入30个字)