从C语言到汇编的转换

4
我该如何从C程序中获取汇编代码?我使用了这个建议,并在Eclipse中使用类似于-c -fmessage-length=0 -O2 -S的参数,但是我遇到了错误。感谢您提前的帮助。
现在我遇到了这个错误。
   atam.c:11: error: conflicting types for 'select'
/usr/include/sys/select.h:112: error: previous declaration of 'select' was here
atam.c:11: error: conflicting types for 'select'
/usr/include/sys/select.h:112: error: previous declaration of 'select' was here

这是我的函数。
int select(int board[],int length,int search){
    int left=0, right=length-1;

    while(1){
        int pivot_index=(right+left)/2;
        int ordered_pivot=partition(board,left,right,pivot_index);

        if(ordered_pivot==search){
            return board[ordered_pivot];
        }
        else if(search<ordered_pivot){
            right=ordered_pivot-1;
        }
        else{
            left=ordered_pivot+1;
        }
    }
}

2
Eclipse不是C编译器,但我猜你正在使用GCC作为后端,所以“-S”应该足够了。 - Michael Mrozek
3个回答

5
Eclipse仍将输出视为对象文件。
gcc -O0 -g3 -Wall -c -fmessage-length=0 -O2 -S -oatam.o ..\atam.c

生成的汇编代码已经如您所愿,但由于传递给GCC的 -oatam.o 参数,它将其混淆存储在 atam.o 中(通常应该将汇编代码存储在 atam.s 中)。下一个命令:

gcc -oatam.exe atam.o

尝试链接atam.o并生成可执行文件,但是atam.o是汇编源文件,而不是目标文件,因此链接器失败。您需要告诉Eclipse不要运行第二个命令(并且您可能想更改第一个命令的输出文件名)。


抱歉,但我到底输入了什么? - lego69
@lego 你只需要使用 gcc -S ..\atam.c 命令,它会生成一个名为 atam.s 的汇编文件。 - Michael Mrozek

2
错误发生的原因是select是一个Unix系统调用,而您的定义与相关系统头文件中的声明冲突。 您需要重新命名您的函数。

在查看修订记录之前,我完全不知道你在说什么;他显然编辑了问题,将其与原始问题完全不同,并在您回答后再次进行了编辑,删除了大部分信息,包括对“select()”的所有引用。 我将其恢复了,因为这似乎是他正在寻找的答案。 - Michael Mrozek

1

-S指示编译器不进行实际的编译和链接步骤,并在发出汇编后停止。另一方面,您还告诉编译器在同一行上编译您的文件(除了其他冲突的设置)。

试试这个:

gcc -O0 -S ../atam.c

优化将使生成的汇编文件与您的源代码更远,因此我指示gcc关闭优化。同时不要运行链接器。


1
“它不起作用”从来都不是有用的。当您从命令行运行时,您遇到了什么错误? - Blindy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接