如何将参数从程序集传递给函数到C

如何将参数从程序集传递给函数到C,c,assembly,C,Assembly,我正在使用HCS08和CodeWarrior。我正在从汇编中调用一个C函数。如何将参数传递给此C函数?您需要的是ABI,或平台的应用程序二进制接口。这将解释如何将参数传递给函数(寄存器、堆栈、混合),哪些寄存器是调用方保存,哪些是被调用方保存,某些寄存器的特殊用途,等等。通过遵循通用ABI,您可以链接由不同编译器构建的库,混合高级语言等等 对于“大型”平台,通常很容易找到指定ABI的文档。对于其他人来说,你可能不得不依赖于分解C函数并查看它的功能。注意它在序言中保存了哪些寄存器,哪些寄存器可能会

我正在使用HCS08和CodeWarrior。我正在从汇编中调用一个C函数。如何将参数传递给此C函数?

您需要的是ABI,或平台的应用程序二进制接口。这将解释如何将参数传递给函数(寄存器、堆栈、混合),哪些寄存器是调用方保存,哪些是被调用方保存,某些寄存器的特殊用途,等等。通过遵循通用ABI,您可以链接由不同编译器构建的库,混合高级语言等等

对于“大型”平台,通常很容易找到指定ABI的文档。对于其他人来说,你可能不得不依赖于分解C函数并查看它的功能。注意它在序言中保存了哪些寄存器,哪些寄存器可能会被打破。还要注意序言是如何在条目上保存堆栈指针(或帧指针)的,因为如果希望调试器工作,就必须模拟堆栈指针(或帧指针)


看起来,飞思卡尔在中记录了HCS08的调用约定。

您需要的是ABI,或平台的应用程序二进制接口。这将解释如何将参数传递给函数(寄存器、堆栈、混合),哪些寄存器是调用方保存,哪些是被调用方保存,某些寄存器的特殊用途,等等。通过遵循通用ABI,您可以链接由不同编译器构建的库,混合高级语言等等

对于“大型”平台,通常很容易找到指定ABI的文档。对于其他人来说,你可能不得不依赖于分解C函数并查看它的功能。注意它在序言中保存了哪些寄存器,哪些寄存器可能会被打破。还要注意序言是如何在条目上保存堆栈指针(或帧指针)的,因为如果希望调试器工作,就必须模拟堆栈指针(或帧指针)


看起来,飞思卡尔在年记录了HCS08的调用约定。

我找到了解决方案

在程序集文件中,将变量声明为:

XREF   varaible1
并将其用作内存位置

在C文件中,将变量声明为全局变量

extern char variable1;

我找到了解决办法

在程序集文件中,将变量声明为:

XREF   varaible1
并将其用作内存位置

在C文件中,将变量声明为全局变量

extern char variable1;
为函数编写c版本(可能只是一个只传递参数的存根),并分析代码。用同样的方法完成你的功能。特定函数的调用方法(在大多数情况下)由其参数集唯一定义

常见的方法是,首先将一些参数(如果它们是在寄存器中传递的整数或指针)推送到堆栈上。但还要注意,varargs的传递方式通常与非varargs不同

特别是对于寄存器很少的6808,所有参数都可能通过堆栈传递。

为函数编写c版本(可能只是一个只传递参数的存根),并分析代码。用同样的方法完成你的功能。特定函数的调用方法(在大多数情况下)由其参数集唯一定义

常见的方法是,首先将一些参数(如果它们是在寄存器中传递的整数或指针)推送到堆栈上。但还要注意,varargs的传递方式通常与非varargs不同


特别是对于寄存器很少的6808,所有参数都可能通过堆栈传递。

+1用于查找调用约定的位置,以及在找不到文档时如何自己找到调用约定。+1用于查找调用约定的位置,如果找不到文件,如何自己解决。