首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SDCC通过内存地址声明函数?

如何使用SDCC通过内存地址声明函数?
EN

Stack Overflow用户
提问于 2018-06-29 15:34:28
回答 1查看 941关注 0票数 2

(非本族语者,我对这个模糊的标题表示歉意)

我使用编译器套件http://sdcc.sourceforge.net/ (3.7.0)为TI-82 STATS计算器编译C代码。它的处理器是Z80。OS提供了几个与设备交互的函数,例如内存地址0x4755处的ClrLcdScreen(),它不带任何参数,也不返回任何内容。

要在程序集中“声明”并调用该函数,我可以执行以下操作:

代码语言:javascript
复制
ClrLcdScreen    equ     0x4755  ; Assembly equivalent of '#define ClrLcdScreen 0x4755'

        call    ClrLcdScreen    ; Call the function at memory address 0x4755

现在,我不知道如何告诉SDCC,我想调用的内存地址0x4755上有一个函数。如何只编写声明并让SDCC知道在运行时哪里可以找到定义?

这就是我可以想象的解决方案的样子(下面的代码不是真实的,它只是用来演示我需要的东西):

代码语言:javascript
复制
__at__ 0x4755 void ClrLcdScreen(); // Function declaration

int main() {
    ClrLcdScreen();
}

我尝试使用内联程序集调用该函数:

代码语言:javascript
复制
#define ClrLcdFull() __asm__("call 0x4755")

int main() {
    ClrLcdFull();
}

这很管用,但不是我想要的。使用该代码,我将自己管理调用,而SDCC根本不知道我正在调用一个函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-29 15:51:22

您可以使用函数指针。你需要做三件事

  • 为函数指针创建一个具有正确返回类型和参数的typedef
  • 使用该typedef声明指针并为指针分配一个地址
  • 像调用其他函数一样调用该函数

例如:

代码语言:javascript
复制
typedef void (*funcptr)(void);

int main(void)
{
    static const funcptr ClrLcdScreen = (funcptr)0x4755;

    ClrLcdScreen();
}

这里有一个不涉及声明指针变量的替代方案。它只是将地址转换为一个函数指针,并调用它。

代码语言:javascript
复制
typedef void (*funcptr)(void);
#define ClrLcdScreen ((funcptr)0x4755)

int main(void)
{
    ClrLcdScreen();
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51105167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档