您的位置:首页 > 其它

正确使用GCC inline assemble 中的 clobber

2010-12-05 19:15 323 查看
clobber的正确使用方法是:如果inline assemble代码使用了没有被初始化地声明为输入值或者输出值的任何其他寄存器,则要通知编译器,编译器必须知道这些寄存器,以便避免使用它们。

看一个例子:

#include <stdio.h>

int main(int argc, char **argv)

{

int data = 10;

int result = 20;

__asm__ __volatile__ ( ".text /n/t"

"movl %1, %%eax /n/t"

"addl %%eax, %0 /n/t"

: "+r" (result)

: "r" (data)

: "eax");

printf("data = %d/nresult = result + data = %d/n", data, result);

return 0;

}

在这个例子中,inline assemble代码将%eax用作存储中间数据。因为这个寄存器没有被声明为输入值或者输出值,所以必须在clobber中包含它。

现在编译器知道%eax不可用,它会避免使用这个寄存器。使用constraint "r"声明输入值,"+r"声明输出值,这使编译器能够选择要使用的寄存器。查看生成的汇编语言代码,可以发现选择了哪些寄存器:

movl $10, 24(%esp)

movl $20, 28(%esp)

movl 24(%esp), %ecx /* data使用%ecx */

movl 28(%esp), %eax /* 编译器正确地避免使用%eax,因为在inline assemble代码中声明了要使用它 */

movl %eax, %edx /* result使用%edx寄存器 */

#APP

# 9 "clobber_test.c" 1

.text

movl %ecx, %eax

addl %eax, %edx

# 0 "" 2

#NO_APP

movl %edx, 28(%esp)

*NOTE*

CLOBBER有个奇怪的地方:如果在inline assemble之内使用了没有在输入值或者输出值中定义的任何内存位置,那它必须被标记为

“被迫坏的“。在clobber中使用"memory"这个词通知编译器这个内存位置在inline assemble代码中被破坏!!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: