gpt4 book ai didi

c - 初学者内联程序集段错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:55 27 4
gpt4 key购买 nike

我是第一次编写内联汇编,但我不知道为什么在尝试运行它时遇到段错误。

#include <stdio.h>
int very_fast_function(int i){
asm volatile("movl %%eax,%%ebx;"
"sall $6,%%ebx;"
"addl $1,%%ebx;"
"cmpl $1024,%%ebx;"
"jle Return;"
"addl $1,%%eax;"
"jmp End;"
"Return: movl $0,%%eax;"
"End: ret;": "=eax" (i) : "eax" (i) : "eax", "ebx" );
return i;
/*if ( (i*64 +1) > 1024) return ++i;
else return 0;*/
}

int main(int argc, char *argv[])
{
int i;
i=40;
printf("The function value of i is %d\n", very_fast_function(i));
return 0;
}

就像我说的,这是我的第一次,所以如果它非常明显,我深表歉意。

最佳答案

您不应直接使用ret。原因:在进入每个函数的时候都有压栈或者保存帧指针等初始化,也有相应的终结。如果直接使用 ret,您只是让堆栈不被恢复。

只要去掉ret就不会出现段错误了。

不过我想结果并不如预期。原因是您的输入/输出约束不符合预期。请注意 "=eax"(i) 你写的没有指定使用 %%eax 作为 i 的输出,而它的意思是对输出变量 i 应用约束 e ax

为了您的目的,您可以简单地使用 r 来指定一个寄存器。查看我刚刚测试过的这段编辑代码:

asm volatile("movl %1,%%ebx;"
"sall $6,%%ebx;"
"addl $1,%%ebx;"
"cmpl $1024,%%ebx;"
"jle Return;"
"addl $1,%0;"
"jmp End;"
"Return: movl $0,%0;"
"End: ;": "=r" (i) : "r" (i) : "ebx" );

此处要显式使用 %%eax,请使用 "=a" 而不是 "=r"

有关更多信息,请阅读此 http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

关于c - 初学者内联程序集段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040458/

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