时间: 2021-07-31 作者:daque
linux 中 x86 的内联系汇率编 将各个局部拉拢起来 developerworks 文书档案选项 将此页动作电子邮件发送 最新引荐 java 运用开拓源能源 - 载入免费软硬件,赶快启用开拓 级别: 低级 bharata b. raoibm linux 本领重心,ibm 软硬件试验室,印度 bharata b. rao 供给了在 linux 平台上运用和结构 x86 内联系汇率编的详细性引见。他引见了内联系汇率编及其百般用法的普通常识,供给了少许基础的内联系汇率编源代码引导,并证明了在 linux 内核中内联系汇率编代码的少许范例。 即使您是 linux 内核的开拓职员,您会创造本人常常要对与体制构造莫大关系的功效举行源代码或优化代码路途。您很大概是经过将汇编谈话训令插入到 c 语句的中央(又称为内联系汇率编的一种本领)来实行那些工作的。让咱们看一下 linux 中内联系汇率编的一定用法。(咱们将计划控制在 ia32 汇编。) gnu 汇编步调简述 让咱们开始看一下 linux 中运用的基础汇编步调语法。gcc(用来 linux 的 gnu c 编写翻译器)运用 at&t 汇编语法。底下列出了这种语法的少许基础准则。(该列表确定不完备;只囊括了与内联系汇率编关系的那些准则。) 存放器定名 存放器称呼有 % 前缀。即,即使必需运用 eax,它该当用作 %eax. 源操纵数和手段操纵数的程序 在一切训令中,先是源操纵数,而后才是手段操纵数。这与将源操纵数放在手段操纵数之后的 intel 语法各别。 mov %eax, %ebx, transfers the contents of eax to ebx. 作数巨细 按照操纵数是字节 (byte)、字 (word) 仍旧长型 (long),训令的后缀不妨是 b、w 或 l.这并不是强迫性的;gcc 会试验经过读取操纵数来供给相映的后缀。但细工指定后缀不妨革新代码的可读性,并不妨取消编写翻译器探求不精确的大概性。 movb %al, %bl —— byte move movw %ax, %bx —— word move movl %eax, %ebx —— longword move 登时操纵数 经过运用 $ 指定径直操纵数。 movl $0xffff, %eax —— will move the value of 0xffff into eax register. 转弯抹角外存援用 任何对外存的转弯抹角援用都是经过运用 ( ) 来实行的。 movb (%esi), %al —— will transfer the byte in the memory pointed by esi into al register 内联系汇率编 gcc 为内联系汇率编供给特出构造,它具备以次方法: gcg 的 "asm" 构造 asm ( assembler template : output operands (optional) : input operands (optional) : list of clobbered registers (optional) ); 本例中,汇编步调沙盘由汇编训令构成。输出操纵数是充任训令输出操纵数运用的 c 表白式。输入操纵数是将对其实行汇编训令输入的 c 表白式。 内联系汇率编的要害性展现在它不妨精巧操纵,并且不妨使其输入经过 c 变量表露出来。由于它具备这种本领,以是 "asm" 不妨用作汇编训令和包括它的 c 步调之间的接口。 一个特殊基础但很要害的辨别在乎 大略内联系汇率编只囊括训令,而 扩充内联系汇率编囊括操纵数。要证明这一点,商量以次示例: 内联系汇率编的基础因素 { int a=10, b; asm ("movl %1, %%eax; movl %%eax, %0;" :"=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" 外反应出来。