2012-09-27 34 views
2

我在彙編語言中使用8051微控制器的延遲例程。我可以在彙編語言程序中使用它們,但我想從c語言中使用這些例程,因爲它們是生成的對我來說完美的延遲。從keil ide的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 

我包括在彙編語言代碼並使用simply.But我想打電話從C源代碼這些例程。

回答

2

要正確接口將彙編函數,你需要做以下步驟:

  • 給你的模塊相同的名字,因爲它是沒有擴展名的文件名(我 假設你的源文件名delays.a51):
MODULE DELAYS 
  • 在每個函數名前加上您希望在C模塊中以下劃線顯示的名稱。

  • 每個需要聲明一個單獨的代碼段與
    以下命名約定函數:

PR FunctionName模塊名

  • 把每個功能?進入它自己的部分。
  • 也是每個函數名應作出PUBLIC

因此,您DELAY1MS功能,您有以下:

?PR?_DELAY1MS?DELAYS SEGMENT CODE 
    RSEG  ?PR?_DELAY1MS?DELAYS 
    PUBLIC  _DELAY1MS 
_DELAY1MS: 
    ... 
    ... 
    RET 

要提供給C編譯器的功能,您應該聲明他們沒有任何的mangling (無下劃線),所以對於DELAY1MS您有:

void Delay1ms(void);

所有這些棘手的遊戲名稱爲&段是鏈接器所必需的,因爲它會在鏈接時爲靜態分配內存變量的內存分配內存。

+0

謝謝you.it對我來說工作正常.. – rajesh6115

+0

不客氣) – Serge

2

我不知道彙編程序和C編譯器之間的接口是如何工作的,但通常您必須告訴彙編程序導出函數(應該有一個指令,請參閱彙編程序手冊)。通常彙編程序中的函數在名稱前需要有下劃線,如_DELAY1S。然後,你需要創建一個extern聲明在源代碼中引用的功能,如

extern void DELAY1S(void); 

這可能是你的工具不同,閱讀文檔

+0

我把#彙編指令作爲#pragma src – rajesh6115