我在汇编语言中有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源代码中调用这些例程。
答案 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);
所有这些名副其实的游戏链接器需要段,因为它构建了调用图,以便在链接时为局部变量静态分配内存。