GCC内嵌汇编

GCC内嵌汇编


限制字符
限制字符有很多种,有些是与特定体系结构相关,此处仅列出常用的限定字符和i386中可能用到的一些常用的限定符。它们的作用是指示编译器如何处理其后的C语言变量与指令操作数之间的关系,例如是将变量放在寄存器中还是放在内存中等,下表列出了常用的限定字母。

“b”将输入变量放入ebx
  “c”将输入变量放入ecx
  “d”将输入变量放入edx
  “s”将输入变量放入esi
  “d”将输入变量放入edi
  “q”将输入变量放入eax,ebx  ,ecx  ,edx中的一个
  “r”将输入变量放入通用寄存器,也就是eax ,ebx,ecx,edx,esi,edi中的一个
  “A”把eax和edx,合成一个64位的寄存器(uselong longs)
  “m”内存变量
  “o”操作数为内存变量,但是其寻址方式是偏移量类型,也即是基址寻址,或者是基址加变址寻址
  “V”操作数为内存变量,但寻址方式不是偏移量类型
  “,” 操作数为内存变量,但寻址方式为自动增量
  “p”操作数是一个合法的内存地址(指针)
 
 
  寄存器或内存
 
  “g” 将输入变量放入eax,ebx,ecx  ,edx中的一个或者作为内存变量
  “X”操作数可以是任何类型

 
  立即数
  “I” 0-31 之间的立即数(用于32位移位指令)
  “J” 0-63 之间的立即数(用于64 位移位指令)
  “N” 0-255  ,之间的立即数(用于out  指令)
  “i” 立即数
  “n” 立即数,有些系统不支持除字以外的立即数,这些系统应该使用“n”而不是“i”

 
  匹配

  "0"、"1" ....."9"
  表示用它限制的操作数与某个指定的操作数匹配,也即该操作数就是指定的那个操作数,例如用“0  ”去描述“%1”操作数,那么“%1”引用的其实就是“%0”操作数,注意作为限定符字母的0-9 ,与指令中的“%0”-“%9”的区别,前者描述操作数,后者代表操作数。

操作数类型
  “=” 操作数在指令中是只写的(输出操作数)
  “+” 操作数在指令中是读写类型的(输入输出操作数)
 
   浮点数
  “f”
 
  浮点寄存器
  “t”第一个浮点寄存器
  “u”第二个浮点寄存器
  “G”标准的80387


现在继续看上面的例子:
"=m" (ADDR)表示ADDR为内存变量(“m”),而且是输出变量(“=”);"Ir" (nr)表示nr,为 0-31之间的立即数(“I”)或者一个寄存器操作数(“r”)。


匹配限制符是一位数字  "0"、"1" ....."9"  , 分别表示它限制的C表达式分别与占位符%0,%1,……%9对应的C变量匹配。例如使用“0”作为%1,的限制字符,那么 %0和%1表示同一个C变量。

你可能感兴趣的:(GCC内嵌汇编)