我需要将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;
}
答案 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来制成的。
不需要编译的输入文件将被忽略。