[英]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.