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

时间:2012-09-27 14:35:00

标签: c assembly 8051 keil

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

延迟的代码是delay.asm文件,我发布的是beleow ...

;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源代码中调用这些例程。

2 个答案:

答案 0 :(得分:2)

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

extern void DELAY1S(void);

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

答案 1 :(得分:2)

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

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

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

  

?PR?FunctionName?模块名

  • 将每个函数放入其自己的细分中。
  • 还应将每个函数名称设为PUBLIC

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

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

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

  

void Delay1ms(void);

所有这些名副其实的游戏链接器需要段,因为它构建了调用图,以便在链接时为局部变量静态分配内存。