2

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

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

;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

我将这段代码包含在汇编语言中并简单地使用。但我想从 c 源代码中调用这些例程。

4

2 回答 2

2

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

extern void DELAY1S(void);

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

于 2012-09-27T14:47:29.113 回答
2

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

  • 为您的模块提供与文件名相同的名称,不带扩展名(我假设您的源文件具有 name delays.a51):
MODULE DELAYS
  • 在每个您希望在 C 模块中可见的函数名称前加上下划线。

  • 对于每个函数,您需要使用
    以下命名约定声明一个单独的代码段:

?PR?FunctionName?ModuleName

  • 将每个函数放入它自己的段中。
  • 还应制作每个函数名称PUBLIC

因此,对于您的 DELAY1MS 功能,您有以下内容:

?PR?_DELAY1MS?DELAYS    SEGMENT CODE
    RSEG        ?PR?_DELAY1MS?DELAYS
    PUBLIC      _DELAY1MS
_DELAY1MS:
    ...
    ...
    RET

要使 C 编译器可以使用函数,您应该在没有任何修改(没有下划线)的情况下声明它们,因此对于 DELAY1MS,您有:

void Delay1ms(void);

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

于 2012-09-27T15:51:32.723 回答