[英]Beginner Inline Assembly Segmentation fault
我是第一次编写Inline程序集,但我不知道为什么在尝试运行它时会遇到Seg错误。
#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
的输出,而意味着将约束e
a
和x
应用于输出变量i
。
为了您的目的,您可以简单地使用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
ret
不应该ret
联汇编块中使用-除了简单的ret
可以处理的功能之外,您需要的功能需要进行一些清理。
请记住,内联汇编直接插入到其嵌入的函数中。它本身并不是一个函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.