我正在使用HCS08和Code Warrior。我从汇编中调用C函数。如何将参数传递给此C函数?
答案 0 :(得分:6)
您需要的是适用于您平台的ABI或应用程序二进制接口。这将解释如何将参数传递给函数(寄存器,堆栈,混合),哪些寄存器是调用者保存,哪些是被调用者保存,某些寄存器的特殊用途等等。通过遵循常见的ABI,您可以链接由不同编译器构建的库,混合使用高级语言等。
对于“大”平台,通常很容易找到指定ABI的文档。对于其他人,您可能不得不依赖于拆解C函数并查看其功能。注意它在序言中保存的寄存器以及它可能会粉碎的寄存器。还要注意序言如何在条目上保存堆栈指针(或帧指针),因为如果你想让调试器工作,你必须模仿它。
飞思卡尔在an appnote中记录了HCS08的调用约定。
答案 1 :(得分:0)
好吧,我找到了解决方案。
在程序集文件中将变量声明为:
XREF varaible1
并将其用作记忆位置
在C文件中将变量声明为全局。
extern char variable1;
答案 2 :(得分:0)
为您的函数编写c版本(可能只是一个只传递参数的存根)并分析代码。你的功能是一样的。特定函数的调用方法(在大多数情况下)由其参数集唯一定义。
常见的方法是,首先是一些参数,如果它们是在寄存器中传递的整数或指针,而其他参数是在堆栈上推送的。但是请注意,varargs通常以不同于非varargs的方式传递。
特别是6808的寄存器很少,所有参数都可能通过堆栈传递。