Printf在内联汇编中

时间:2014-05-29 21:27:56

标签: c assembly inline-assembly

我正在尝试编写一个内联的assebles函数来交换两个值。(并且我使用扩展的ASM格式)

此代码有效:

#include <stdio.h>
void Exchange(int *x, int *y)
{
printf("In Exchange function: Before exchange x is: %d\n",*x);
printf("In Exchange function: Before exchange y is: %d\n",*y);

asm("xchg %%eax,%%edx\n\t" \
:"+a"(*x),"+d"(*y));

printf("In Exchange function: After exchange x is: %d\n",*x);
printf("In Exchange function: After exchange y is: %d\n",*y);


}


int main()
{
int x=20;
int y=30;
printf("In main: Before exchange x is: %d\n",x);
printf("In main: Before exchange y is: %d\n",y);
Exchange(&x,&y);
printf("In main: After exchange x is: %d\n",x);
printf("In main: After exchange y is: %d\n",y);


return 0;
}

但是当我尝试在下面的完全组装中对其进行处理时,会出现分段错误(核心转储)错误。

void Exchange(int *x, int *y)
{
asm("subl $8,%%esp\n\t" \
    "movl %%eax,4(%%esp)\n\t" \
    "movl %%edx,(%%esp)\n\t" \
    "call printf\n\t" \
    "addl $8,%%esp\n\t" \   
    "xchg %%eax,%%edx\n\t" \
    "subl $8,%%esp\n\t" \
    "movl %%eax,4(%%esp)\n\t" \
    "movl %%edx,(%%esp)\n\t" \
    "call printf\n\t" \
    "addl $8,%%esp\n\t" \
:"+a"(*x),"+d"(*y));

}
 int main() 
{   
int x=20;
int y=30; 
printf("In main: Before exchange x is: %d\n",x);
printf("In main: Before exchange y is: %d\n",y);
Exchange(&x,&y);
printf("In main: After exchange x is: %d\n",x);
printf("In main: After exchange y is: %d\n",y);


return 0;
}

Aren我们允许在汇编部分使用printf函数吗?

1 个答案:

答案 0 :(得分:3)

你的asm代码用两个整数参数调用printf - 没有格式字符串。所以它试图取消引用第一个整数作为指向格式字符串的指针并崩溃。

此外,调用printf会破坏%eax和%edx中的值,因为它们不会在标准x86调用约定中的调用中保留。