我在汇编语言language.Ana中有8051微控制器的延迟例程,我可以在汇编语言程序中使用它们,但我想使用c语言中的这些例程,因为它们对我来说产生了完美的延迟。
delay的代码是我在下面发布的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我将这些代码包含在汇编语言中,并使用simply.But,我想从c源代码中调用这些例程。
发布于 2012-09-27 23:51:33
要正确连接汇编器函数,您需要执行以下步骤:
为您的模块提供与其文件名相同的名称,但不带扩展名(我假设您的源文件的名称为delays.a51): ),请使用
模块延迟
使用underscore.
以下命名约定:
?PR?函数名?模块名
将每个函数放入它自己的segment.
PUBLIC因此,对于您的DELAY1MS函数,您具有以下内容:
?PR?_DELAY1MS?DELAYS SEGMENT CODE
RSEG ?PR?_DELAY1MS?DELAYS
PUBLIC _DELAY1MS
_DELAY1MS:
...
...
RET要使函数对C编译器可用,您应该声明它们而不进行任何损坏(无下划线),因此对于DELAY1MS,您需要:
void Delay1ms(void);
所有这些带有名称和段的棘手游戏都是链接器所必需的,因为它构建了调用图,以便在链接时为局部变量静态地分配内存。
发布于 2012-09-27 22:47:29
我不知道你的汇编程序和你的C编译器之间的接口是如何工作的,但通常你必须告诉汇编程序导出函数(应该有一个关于这方面的指令,看看汇编手册)。通常,汇编器中的函数在名称前需要有下划线,如_DELAY1S。然后需要在源代码中创建一个引用该函数的extern声明,如下所示
extern void DELAY1S(void);对于您的工具,可能会有所不同,请阅读文档。
https://stackoverflow.com/questions/12623826
复制相似问题