繁体   English   中英

初学者内联汇编分割错误

[英]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 ax应用于输出变量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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM