如何使用 SDCC 通过内存地址声明函数
How can I declare a function by memory address with SDCC
(Non-native 发言者,我为模糊的标题道歉)
我正在使用编译器套件 sdcc (3.7.0) to compile C code for the TI-82 STATS 计算器。它的处理器是Z80。 OS 提供了几个与设备交互的函数,例如内存地址为 0x4755 的 ClrLcdScreen(),它不带任何参数,returns 什么也没有。
要"declare"并在汇编中调用该函数,我可以执行以下操作:
ClrLcdScreen equ 0x4755 ; Assembly equivalent of '#define ClrLcdScreen 0x4755'
call ClrLcdScreen ; Call the function at memory address 0x4755
现在我不确定如何告诉 SDCC 我想调用内存地址 0x4755 处有一个函数。 我怎样才能只写声明并让 SDCC 知道在运行时在哪里可以找到定义?
这就是我想象的解决方案的样子(以下代码不是真实的,它只是 made-up 来演示我需要的):
__at__ 0x4755 void ClrLcdScreen(); // Function declaration
int main() {
ClrLcdScreen();
}
我试过使用内联汇编调用函数:
#define ClrLcdFull() __asm__("call 0x4755")
int main() {
ClrLcdFull();
}
这行得通,但不是我想要的。使用该代码,我自己管理调用,而 SDCC 根本不知道我正在调用一个函数。
您可以使用函数指针。您需要做三件事
- 为具有正确 return 类型和参数的函数指针创建
typedef
- 使用该指针声明一个指针
typedef
并为该指针分配一个地址
- 像调用任何其他函数一样调用该函数
例如:
typedef void (*funcptr)(void);
int main(void)
{
static const funcptr ClrLcdScreen = (funcptr)0x4755;
ClrLcdScreen();
}
这是一个不涉及声明指针变量的替代方法。它只是将地址转换为函数指针,然后调用它。
typedef void (*funcptr)(void);
#define ClrLcdScreen ((funcptr)0x4755)
int main(void)
{
ClrLcdScreen();
}
(Non-native 发言者,我为模糊的标题道歉)
我正在使用编译器套件 sdcc (3.7.0) to compile C code for the TI-82 STATS 计算器。它的处理器是Z80。 OS 提供了几个与设备交互的函数,例如内存地址为 0x4755 的 ClrLcdScreen(),它不带任何参数,returns 什么也没有。
要"declare"并在汇编中调用该函数,我可以执行以下操作:
ClrLcdScreen equ 0x4755 ; Assembly equivalent of '#define ClrLcdScreen 0x4755'
call ClrLcdScreen ; Call the function at memory address 0x4755
现在我不确定如何告诉 SDCC 我想调用内存地址 0x4755 处有一个函数。 我怎样才能只写声明并让 SDCC 知道在运行时在哪里可以找到定义?
这就是我想象的解决方案的样子(以下代码不是真实的,它只是 made-up 来演示我需要的):
__at__ 0x4755 void ClrLcdScreen(); // Function declaration
int main() {
ClrLcdScreen();
}
我试过使用内联汇编调用函数:
#define ClrLcdFull() __asm__("call 0x4755")
int main() {
ClrLcdFull();
}
这行得通,但不是我想要的。使用该代码,我自己管理调用,而 SDCC 根本不知道我正在调用一个函数。
您可以使用函数指针。您需要做三件事
- 为具有正确 return 类型和参数的函数指针创建
typedef
- 使用该指针声明一个指针
typedef
并为该指针分配一个地址 - 像调用任何其他函数一样调用该函数
例如:
typedef void (*funcptr)(void);
int main(void)
{
static const funcptr ClrLcdScreen = (funcptr)0x4755;
ClrLcdScreen();
}
这是一个不涉及声明指针变量的替代方法。它只是将地址转换为函数指针,然后调用它。
typedef void (*funcptr)(void);
#define ClrLcdScreen ((funcptr)0x4755)
int main(void)
{
ClrLcdScreen();
}