繁体   English   中英

从Keil IDE中的C源代码调用汇编例程

[英]calling assembly routines from c source code in keil ide

我在汇编语言中有8051微控制器的延迟例程。我可以在汇编语言程序中使用它们,但是我想从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源代码中调用这些例程。

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

extern void DELAY1S(void);

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

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

  • 为您的模块提供与文件名相同的名称(不带扩展名)(我假设您的源文件具有名称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);

链接器需要使用所有带有名称和段的棘手游戏,因为它会建立调用图以在链接时为本地变量静态分配内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM