我需要将用C(.c)编写的代码转换为Assembly(.asm)。我对用C编写非常陌生,现在我需要学习如何用汇编编写

时间:2019-04-03 20:09:56

标签: c assembly

我需要将C代码转换为程序集

这是我的C代码,需要转换为Assembly(.asm)

int main()
{
   //Variables that stores the numbers
   int num1, num2, num3;
   // Variable that stores the result
   int result;
   // Asking the user to input the value of num1
   printf("Enter the first number:");
   scanf("%d",&num1);
   // Asking the user to input the value of num2
   printf("Enter the second number:");
   scanf("%d",&num2);
   // Asking the user to input the value of num3
   printf("Enter the third number: ");
   scanf("%d",&num3);
   //Performing the operation
   result = num3 - (num1 + num2);
   //Printing the result
   printf("The value of result is: %d",result);
   return 0;
}

3 个答案:

答案 0 :(得分:1)

从理论上讲,您可以仅使用gcc对其进行编译,并对其进行排序以生成asm列表(将成为汇编程序),因此您只需将其扩展名更改为.asm(https://www.systutorials.com/240/generate-a-mixed-source-and-assembly-listing-using-gcc/

尽管如此,一般来讲,在组件中包括scanf和printf或任何库函数都是不好的主意(因为它们在asm中可能真的很长,特别是系统调用,例如读/写/打开,printf)。

以防万一您上大学的某人要求您用ASM编写某些内容,他们会知道它不是您编写的。

从标题来看,用C清单学习ASM也不是可行的方法(例如,由于过程调用中的堆栈操作)。

答案 1 :(得分:0)

正如安蒂·哈帕拉(Antti Haapala)所说,通常的gcc可以解决问题。您将获得一个编译的二进制文件,可以使用以下命令读取该文件:

objdump -d file

您有很多工具可以帮助您读取二进制文件,例如gdb,xxd,objdump等。
还有Ghidra,它是新的,但是我不确定这一点。

答案 2 :(得分:0)

如果要直接使用gcc编译为程序集,则可以使用-S选项。在gcc手册页中:

  

-S 在适当的编译阶段后停止;不要组装。对于指定的每个非汇编程序输入文件,输出均为汇编代码文件的形式。

     

默认情况下,源文件的汇编文件名是通过将后缀.c,.i等替换为.s来制成的。

     

不需要编译的输入文件将被忽略。