我有一个关于装配工的问题。我在想如何将以多个参数为参数的C函数转换成汇编。所以我的问题是,程序集中是否有一个子例程将参数作为操作参数?
代码可能如下所示:
打电话给label1,R16。
其中R16是子程序输入参数。
如果不是这样的话,那就意味着每次调用C函数时,它都会被组装成一个子程序,其中与特定调用相关的参数会被自动替换。这基本上意味着,每当调用C函数时,编译器都会将其转换为内联函数,这肯定也不是这样的:D
那么哪个是对的?
多谢!:)
最佳答案
编译器使用“调用约定”,该约定可以特定于该单目标体系结构(x86、arm、mips、pdp-11等)的一个编译器。对于具有“大量”通用寄存器的体系结构,调用约定通常从在寄存器中传递参数开始,然后使用堆栈,对于没有大量寄存器的体系结构,堆栈主要用于参数传递和返回。
调用约定是一组规则,这样,如果每个人都遵循这些规则,您就可以将函数编译成对象,并将它们与其他对象链接起来,它们就可以相互调用函数或调用自己。
所以这有点像你的假设。为该函数构建的代码在某些方面是该函数的自定义代码,因为参数的数量和类型决定了哪些寄存器或使用了多少堆栈以及如何使用。同时,所有函数都遵循相同的公式,因此它们看起来更相似而不是不同。
例如,在arm上,可能有三个整数被传递给一个函数,对于我所看到的所有arm调用约定(一般来说,您会发现,尽管在不同的编译器中它可能会有所不同,但通常不会,或者在arm和mips以及其他一些情况下,它们试图为所有人而不是试图执行该约定的编译器人员指定该约定),C函数中的第一个参数将出现在r0中,即r1第二,r2第三。如果第一个参数是64位整数,则r0和r1用于第一个参数,r2获取第二个参数,r3获取第三个参数,在r3使用堆栈之后,堆栈上参数的顺序也由约定决定。因此,当调用方或被调用方的代码使用相同的C原型编译时,双方都知道在哪里可以找到参数,并构造汇编语言来完成这项工作。
关于c - 从编译器到汇编器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35032284/