gpt4 book ai didi

c - 内联汇编中的 Printf

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:49 25 4
gpt4 key购买 nike

我正在尝试编写一个交换两个值的内联 assebly 函数。(并且我正在使用扩展的 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;
}

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

最佳答案

您的 asm 代码使用两个整数参数调用 printf —— 没有格式字符串。因此它尝试将第一个整数取消引用为指向格式字符串的指针并崩溃。

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

关于c - 内联汇编中的 Printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23943297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com