2011-03-03 82 views
2

所有内容都在标题中。 由于某些原因,我必须这样做。GCC呼叫标签作为功能

但是当我编译我的代码,海湾合作委员会(或气体也许...)显示以下错误:

... /温度/ cc1C1fjs.s:19:错误:立即数与非法绝对跳转

代码:

int main (int argc, char **argv) 
{ 
    /* Some code */ 

    ((void(*)()) &&label)(); 

    /* Some code */ 

    return 0; 

    label: 
    asm ("push %ebp"); 
    asm ("mov %esp,%ebp"); 

    /* Some code */ 
    printf("Hello world"); 

    asm ("leave"); 
    asm("ret"); 
} 

我敢肯定,这应该作品,因为我试图创建使用CreateThread函数(我是windows下)specifing为切入点标签的地址线,它完美的作品好。 那么我怎样才能确保编译器接受这个语法? 或者有其他方法可以做到这一点?

+0

下一次,用四个空格缩进你的代码,所以它被视为代码。选择您的代码并按^ K。 – 2011-03-03 01:59:36

+0

作为一个学习点,你为什么使用一个标签作为函数指针? – 2011-03-03 14:01:42

回答

0

我没有你的解决方案,但我有几个建议:

  1. 运行gcc -S file.c看看线#19,看你是否能发现实际的问题是什么。
  2. 翻阅(短).s文件的其余部分,看看是否有什么明显的错误。例如,我的版本gcc似乎认为return 0之后的所有内容都是无效代码,因此您的asm代码和printf都不会将其实际传送给汇编程序。
  3. 这段代码不能移入函数吗?这样你就可以免费得到序言/后记;采取地址也不会有困难。
0

我解决了问题的一部分:

  1. @aix你有权利,GCC删除 一切主要功能 的return 0;后,我通过

    asm("leave"); 
    asm("xor %eax,%eax"); 
    asm("ret"); 
    
    固定这个 替换它

    现在生成我的标签后面的代码。

  2. 运行gcc -S file.c然后 gcc file.s -o file.exe,当然它显示错误和在 错误行有call *$L2 (L2是在我的C文件标签)。它的工作原理是 ,取而代之的是call L2

    现在我的标签后,我的主调用之后的代码被执行 和程序正确 与状态0

终止但我不希望有各做一次,我将编译。 GCC写call *$L2而不是call L2是否正常?