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内联汇编

GCC,linux的GNU C编译器使用AT&T/UNIX汇编语法。 (一):AT&T汇编和intel汇编的不同 1:前缀 在intel语法中,寄存器和立即数都没有前缀,而在AT&T中,寄存器使...
  • hongbochen1223
  • hongbochen1223
  • 2015年04月17日 21:53
  • 901

gcc 内联汇编用法介绍

前言大部分内容翻译提取自某国外HOW-TO文档,原地址: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html AT&T汇...
  • qq_29343201
  • qq_29343201
  • 2016年08月13日 16:52
  • 1484

GCC内联汇编入门

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE ...
  • wuyao721
  • wuyao721
  • 2008年12月21日 15:48
  • 4401

最牛X的GCC 内联汇编

导读 正如大家知道的,在C语言中插入汇编语言,其是Linux中使用的基本汇编程序语法。本文将讲解 GCC 提供的内联汇编特性的用途和用法。对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86...
  • Jack__CJ
  • Jack__CJ
  • 2016年09月21日 19:10
  • 839

在gcc中使用intel风格的内联汇编

很简单,内联汇编使用asm(“.intel_syntax noprefix/n”)声明一下,以后的内联汇编就可以用intel风格了,构建可执行文件时给gcc加上-masm=intel参数。先写一个小程...
  • jcwKyl
  • jcwKyl
  • 2009年12月12日 08:45
  • 4840

GCC内联汇编基础

这篇文章阐述内联汇编的使用方法。显然,阅读这篇文章您需要具备X86汇编语言和C语言的基础知识。 Contents 1. 简介 3 2. 概要 3 3. GCC汇编格式。 3 1) 源操作数和目的操...
  • nancygreen
  • nancygreen
  • 2013年10月24日 15:40
  • 1343

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

​首先是这么一段代码(例一)​: #include void main() { char c; //int tmp; char *s="abcdefg"; asm("...
  • u010035971
  • u010035971
  • 2014年10月06日 20:24
  • 1057

GCC 内联汇编

来源:IBM 用汇编编写的程序虽然运行速度快,但开发速度非常慢,效率也很低。如果只是想对关键代码段进行优化,或许更好的办法是将汇编指令嵌入到 C 语言程序中,从而充分利用高级语言和汇编语言各自的...
  • farmwang
  • farmwang
  • 2015年12月02日 22:32
  • 500

GCC 内联汇编(GCC内嵌ARM汇编规则)

转自:http://www.cppblog.com/jb8164/archive/2008/02/26/43260.html 有时为了高效,有时为了直接控制硬件,有些模块我们不得不直接用汇编语言来编...
  • duanlove
  • duanlove
  • 2012年11月21日 18:05
  • 1738

AT&T 汇编和 GCC 内联汇编简介

AT&T 汇编和 GCC 内联汇编简介   对一个应用程序员来讲,了解汇编不是必需的,更少有手写纯汇编的需求。但是如果能了解些基本的汇编知识,对程序调试和一些语言特性的理解是大有裨益的。本文...
  • ganggexiongqi
  • ganggexiongqi
  • 2014年04月24日 21:01
  • 1078
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux GCC内联汇编 常用 constraints
举报原因:
原因补充:

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