簡體   English   中英

從Keil IDE中的C源代碼調用匯編例程

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM