您的位置:首页 > 其它

GCC内嵌汇编

2016-03-25 16:26 232 查看
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变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: