变量输出-复高斯分布的数学基础理论

时间:2024-06-28 07:07:17
【文件属性】:

文件名称:变量输出-复高斯分布的数学基础理论

文件大小:6.48MB

文件格式:PDF

更新时间:2024-06-28 07:07:17

嵌入式 Linux C

(1)变量输入 根据限定符的内容将输入操作数放入合适的寄存器,如果限定符指定为立即数(i)或内 存变量(m),则该步被省略;如果限定符没有具体指定输入操作数的类型(如常用的 g), gcc 会视需要决定是否将该操作数输入到某个寄存器。 这样每个占位符都与某个寄存器、内存变量或立即数形成一一对应的关系。这就是对第 二个冒号后内容的解释。例如:"a"(foo)、"i"(100)、"m"(bar)表示%0 对应 eax 寄存器、%1 对 应 100、%2 对应内存变量 bar。 (2)生成代码 gcc 再根据这种一一对应的关系(还应包括输出操作符),用这些寄存器、内存变量或立 即数来取代汇编代码中的占位符。注意,在这一步骤中并不检查由这种取代操作所生成的汇 编代码是否合法。例如,如果有这样一条指令: __asm__("movl %0,%1"::"m"(foo),"m"(bar)); 如果用户使用“gcc -c –S”选项编译该源文件,那么在生成的汇编文件中,用户将会看到生 成了“movl foo,bar”这样一条指令,这显然是错误的。这个错误在稍后的编译检查中会被发现。 (3)变量输出 按照输出限定符的指定将寄存器的内容输出到某个内存变量中,如果输出操作数的限定 符指定为内存变量(m),则该步骤被省略。这就是对第一个冒号后内容的解释,例如: __asm__("mov %0,%1":"=m"(foo),"=a"(bar):); 编译后为: #APP movl foo,eax #NO_APP movl eax,bar 该语句很好地体现了 gcc 的运作方式。 下面以中的一段代码为例,来比较一下它们编译前后的情况,源 程序如下: __asm__ ( "pushl %%edi\n\t" "pushl %%ebp\n\t" "lcall %%cs:\n\t" "setc %%al\n\t" "addl %1,%2\n\t" "popl %%ebp\n\t" "popl %%edi\n\t" :"=a"(ea),"=b"(eb), "=c"(ec),"=d"(ed),"=S"(es) :"a"(eax_in),"b"(ebx_in),"c"(ecx_in) :"memory","cc"); 编译后的汇编代码为: movl eax_in,%eax movl ebx_in,%ebx movl ecx_in,%ecx #APP


网友评论