GCC将标签作为函数调用

GCC将标签作为函数调用,gcc,label,call,gnu-assembler,Gcc,Label,Call,Gnu Assembler,一切都在标题中。 出于某些原因,我不得不这样做 但当我编译代码时,GCC或GAS可能。。。显示以下错误: …/Temp/cc1C1fjs.s:19:错误:立即操作数与绝对跳转非法 代码: 我确信这应该是可行的,因为我试图使用CreateThread函数创建一个线程,我在windows下将标签的地址指定为入口点,它工作得非常好。 那么如何确保编译器接受这种语法呢? 或者还有其他方法可以做到这一点?我没有解决方案,但我有几个建议: 运行gcc-sfile.c并查看第19行,看看是否能够发现实际问题。

一切都在标题中。 出于某些原因,我不得不这样做

但当我编译代码时,GCC或GAS可能。。。显示以下错误:

…/Temp/cc1C1fjs.s:19:错误:立即操作数与绝对跳转非法

代码:

我确信这应该是可行的,因为我试图使用CreateThread函数创建一个线程,我在windows下将标签的地址指定为入口点,它工作得非常好。 那么如何确保编译器接受这种语法呢?
或者还有其他方法可以做到这一点?

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

运行gcc-sfile.c并查看第19行,看看是否能够发现实际问题。 查看short.s文件的其余部分,看看是否有明显的错误。例如,我的gcc版本似乎决定返回0后的所有内容都是死代码,因此asm代码和printf实际上都没有发送到汇编程序。 不能将此代码移到函数中吗?这样你就可以免费获得开场白/尾声;发表演讲也不会那么困难。
我没有解决方案,但我有几个建议:

运行gcc-sfile.c并查看第19行,看看是否能够发现实际问题。 查看short.s文件的其余部分,看看是否有明显的错误。例如,我的gcc版本似乎决定返回0后的所有内容都是死代码,因此asm代码和printf实际上都没有发送到汇编程序。 不能将此代码移到函数中吗?这样你就可以免费获得开场白/尾声;发表演讲也不会那么困难。
我修复了部分问题:

@aix您有权删除GCC吗 主要功能的一切 返回0之后;,我把这个修好了 取而代之的是

asm("leave");
asm("xor %eax,%eax");
asm("ret");
现在,生成标签后的代码

然后运行gcc-S file.c gcc file.s-o file.exe,当然它会显示错误并在 那里的错误行是call*$L2 L2是我的c文件中的标签。它起作用了 通过调用L2替换它

现在,在我的标签和我在main中的调用之后的代码是 正确地执行程序 以状态0终止

但我不想每次编译时都这么做。
GCC写调用*$L2而不是调用L2是否正常?

我修复了部分问题:

@aix您有权删除GCC吗 主要功能的一切 返回0之后;,我把这个修好了 取而代之的是

asm("leave");
asm("xor %eax,%eax");
asm("ret");
现在,生成标签后的代码

然后运行gcc-S file.c gcc file.s-o file.exe,当然它会显示错误并在 那里的错误行是call*$L2 L2是我的c文件中的标签。它起作用了 通过调用L2替换它

现在,在我的标签和我在main中的调用之后的代码是 正确地执行程序 以状态0终止

但我不想每次编译时都这么做。
GCC编写call*$L2而不是call L2是正常的吗?

下次,请将代码缩进四个空格,以便将其视为代码。选择您的代码并按^K。作为学习要点,您为什么要使用标签作为函数指针?下次,请将代码缩进四个空格,以便将其视为代码。选择您的代码并按^K。作为学习要点,您为什么要使用标签作为函数指针?