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