2

アセンブリ言語で 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 ソース コードから呼び出したいと考えています。

4

2 に答える 2

2

アセンブラーと C コンパイラーの間のインターフェースがどのように機能するかはわかりませんが、通常、アセンブラーに関数をエクスポートするように指示する必要があります (そのためのディレクティブがあるはずです。アセンブラーのマニュアルを参照してください)。通常、アセンブラーの関数には、名前の前にアンダースコアが必要_DELAY1Sです。extern次に、次のように、関数を参照するソース コードで宣言を作成する必要があります。

extern void DELAY1S(void);

ツールによって異なる場合があります。ドキュメントをお読みください。

于 2012-09-27T14:47:29.113 に答える
2

アセンブラー関数を適切にインターフェースするには、次の手順を実行する必要があります。

  • モジュールに拡張子なしのファイル名と同じ名前を付けます(ソースファイルには name があると仮定しますdelays.a51):
MODULE DELAYS
  • C モジュールで表示したい各関数名の前にアンダースコアを追加します。

  • 関数ごとに
    、次の命名規則で個別のコード セグメントを宣言する必要があります。

?PR?関数名?モジュール名

  • 各機能を独自のセグメントに配置します。
  • また、各関数名を作成する必要がありますPUBLIC

したがって、DELAY1MS 関数の場合、次のようになります。

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

関数を C コンパイラで使用できるようにするには、マングリングなし (アンダースコアなし) で宣言する必要があります。したがって、DELAY1MS の場合は次のようになります。

void Delay1ms(void);

リンカは、リンク時にローカル変数に静的にメモリを割り当てる呼び出しのグラフを作成するため、名前とセグメントに関するこのトリッキーなゲームはすべてリンカに必要です。

于 2012-09-27T15:51:32.723 に答える