【问题标题】:from C to assembly从 C 到汇编
【发布时间】:2010-05-22 21:33:16
【问题描述】:

如何从我使用过的 C 程序中获取汇编代码 recommendation 我在 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;
        }
    }
}

【问题讨论】:

  • Eclipse 不是 C 编译器,但我猜你使用 GCC 作为后端,所以 -S 应该足够了

标签: c eclipse assembly


【解决方案1】:

Eclipse 仍将输出视为目标文件

gcc -O0 -g3 -Wall -c -fmessage-length=0 -O2 -S -oatam.o ..\atam.c

正在生成您想要的程序集,但由于将 -oatam.o 传递给 GCC(通常您会将程序集存储在 atam.s),所以将其存储在 atam.o 中令人困惑。下一条命令:

gcc -oatam.exe atam.o

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

【讨论】:

  • 抱歉,我到底输入了什么?
  • @lego gcc -S ..\atam.c 是您所需要的;这将生成一个名为 atam.s 的程序集文件
【解决方案2】:

发生错误是因为 select 是一个 Unix 系统调用,并且您的定义与相关系统标头中的声明冲突。你需要重命名你的函数。

【讨论】:

  • 在查看修订历史之前,我完全混淆了您在说什么;他显然编辑了问题以说出与原始问题完全不同的内容,然后在您回答后再次编辑以取出大部分信息,包括对select()的所有引用。我回滚了,因为这似乎是他正在寻找的答案
【解决方案3】:

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

试试这个:

gcc -O0 -S ../atam.c

优化会使生成的汇编文件远离你的源代码,所以我指示 gcc 关闭优化。也不要运行链接器。

【讨论】:

  • “它不起作用”从来没有帮助。从命令行运行时遇到什么错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2018-05-31
相关资源
最近更新 更多