文件名称:变量输出-复高斯分布的数学基础理论
文件大小: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 的运作方式。
下面以