我目前正试图找出从相应的c源文件生成等效汇编代码的方法。 (原谅我不会说流利的英语,我不熟悉英语。)
我已经使用C语言好几年了,但对汇编语言几乎没有经验。
我能够在gcc中使用S选项输出汇编代码。但是,生成的汇编代码包含调用指令,而调用指令又会跳转到另一个函数,如_exp。这不是我想要的,我需要在单个文件中使用功能齐全的汇编代码,而不依赖于其他代码。
是否有可能实现我所寻找的目标? 我很感激得到答案!
编辑:为了更好地描述问题,我在这里向您展示我的代码:
#include <math.h>
float sigmoid(float i){
return 1/(1+exp(-i));
}
是的,这是令人尴尬的短暂,我应该在我第一次提出这个问题时提供它。我还想补充一点,我目前正在使用的平台是Windows 10 64bit,我使用的编译器是来自MSbuild的cl.exe。再次感谢先进!
编辑2:我现在看到我没有清楚地描述我想要的东西。对不起,我很抱歉。无论如何,我最初的目标是在最低级别看到计算机如何计算数学函数。我决定观察计算过程的级别是汇编代码,我选择的数学函数是上面定义的sigmoid。
答案 0 :(得分:1)
_exp
是标准的数学库函数double exp(double)
;显然,你所处的平台上有一个前导下划线到C符号名称。
给定调用某些库函数的.s
,以与调用库函数的.c
文件相同的方式构建它:
gcc foo.S -o foo -lm
默认情况下,您将获得动态可执行文件。
但如果你真的希望所有代码放在一个没有外部依赖关系的文件中,你可以将.c
链接到一个静态可执行文件并反汇编。
gcc -O3 -march=native foo.c -o foo -static -lm
objdump -drwC -Mintel foo > foo.s
无法保证_exp
(静态库)中的libm.a
实现与您在libm.so
或libm.dll
或其他内容中的实现相同,因为它是一个不同的文件。对于像memcpy
这样的函数尤其如此,其中动态链接器技巧通常用于在运行时为您的CPU选择最佳版本。
答案 1 :(得分:0)
一般来说,这是不可能的,有一些例外,我可以制作一个,这意味着其他人也可以,但它不是一个有趣的程序。
通常你的C程序,你的main()入口点只是代码的一个百分比。有一个引导程序包含操作系统启动程序的实际入口点,这会做一些准备虚拟内存空间的事情,以便程序可以运行。 Zeros .bss和其他类似的东西。通常和/或应该用汇编语言编写(否则你会得到鸡和蛋的问题)但是你会看到汇编语言文件,除非你找到C库的源代码,你经常会得到一个对象作为工具链以及其他编译器库等
然后,如果你进行任何C调用或创建导致编译器库调用的代码(在不支持除法的平台上执行除法,在没有浮点的平台上执行浮点等),这是另一个对象来自其他一些C或程序集,它们是库或编译器源代码的一部分,并不是您在编译/汇编/链接(工具链中的链)过程中看到的东西。
除了专门设计的琐碎程序或专门用于此目的的工具(对于特定的裸机平台),你不会看到整个程序在汇编然后链接之前变成一个大的汇编源文件。
如果不是baremetal那么当然有操作系统层你肯定不会看到它作为你的源代码的一部分,最终C库调用需要系统将有一个他们这样做的地方,所有编译在使用它们之前使用object / lib,而操作系统端的汇编源是其他地方的其他源和构建过程的一部分。