首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在keil ide中从c源代码调用汇编例程

在keil ide中从c源代码调用汇编例程
EN

Stack Overflow用户
提问于 2012-09-27 22:35:00
回答 2查看 2.1K关注 0票数 2

我在汇编语言language.Ana中有8051微控制器的延迟例程,我可以在汇编语言程序中使用它们,但我想使用c语言中的这些例程,因为它们对我来说产生了完美的延迟。

delay的代码是我在下面发布的delay.asm文件...

代码语言:javascript
复制
;ALL DELAYS ROUTINES HERE
DELAY_SEG SEGMENT CODE
RSEG DELAY_SEG
;DELAY OF 1MS SUBROUTINE
DELAY1MS:
     MOV R7,#250
     DJNZ R7,$
     MOV R7,#247
     DJNZ R7,$
     RET
;DELAY OF 100MS SUBROUTINE
DELAY100MS:
     MOV R6,#99;1MUS
L1:
     ACALL DELAY1MS ;99MS
     DJNZ R6,L1;198MUS
     MOV R6,#250;1MUS
     DJNZ R6,$;500US
     MOV R6,#147;1US
     DJNZ R6,$;294US
     NOP
     RET;1US
;DELAY 0F 1SEC SUB ROUTINE
DELAY1S:
     MOV R5,#9
L2:
     ACALL DELAY100MS
     DJNZ R5,L2
     MOV R5,#99
L3:
     ACALL DELAY1MS
     DJNZ R5,L3
     MOV R5,#250
     DJNZ R5,$
     MOV R5,#138
     DJNZ R5,$
     RET

我将这些代码包含在汇编语言中,并使用simply.But,我想从c源代码中调用这些例程。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 23:51:33

要正确连接汇编器函数,您需要执行以下步骤:

为您的模块提供与其文件名相同的名称,但不带扩展名(我假设您的源文件的名称为delays.a51): ),请使用

模块延迟

使用underscore.

  • for在希望在C模块中可见的每个函数名称前面加上
  • 每个需要声明单独代码段的函数

以下命名约定:

?PR?函数名?模块名

将每个函数放入它自己的segment.

  • also中,每个函数的名称都应该成为PUBLIC

因此,对于您的DELAY1MS函数,您具有以下内容:

代码语言:javascript
复制
?PR?_DELAY1MS?DELAYS    SEGMENT CODE
    RSEG        ?PR?_DELAY1MS?DELAYS
    PUBLIC      _DELAY1MS
_DELAY1MS:
    ...
    ...
    RET

要使函数对C编译器可用,您应该声明它们而不进行任何损坏(无下划线),因此对于DELAY1MS,您需要:

void Delay1ms(void);

所有这些带有名称和段的棘手游戏都是链接器所必需的,因为它构建了调用图,以便在链接时为局部变量静态地分配内存。

票数 2
EN

Stack Overflow用户

发布于 2012-09-27 22:47:29

我不知道你的汇编程序和你的C编译器之间的接口是如何工作的,但通常你必须告诉汇编程序导出函数(应该有一个关于这方面的指令,看看汇编手册)。通常,汇编器中的函数在名称前需要有下划线,如_DELAY1S。然后需要在源代码中创建一个引用该函数的extern声明,如下所示

代码语言:javascript
复制
extern void DELAY1S(void);

对于您的工具,可能会有所不同,请阅读文档。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12623826

复制
相关文章

相似问题

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