教授は、アセンブリ コードを使用してプログラムの一部をプログラミングし、そのコードを C プログラム内から呼び出し、それが完了したら C プログラムに戻るようにしてほしいと言っています。これに関するドキュメントが見つからないようです。問題があれば、68HC12 を使用する Dragon12 ボードを使用しています。彼は、インライン asm() 関数を使用することを望んでいるようには見えません。
4 に答える
アセンブリで定義された関数は、Cの通常の関数と同じように呼び出すことができます(適切な呼び出し規約を使用している場合)。戻り値の型と引数が一致していることを確認してください。たとえば、アセンブリが次のようになっている場合:
my_func:
; assembly code here
; some more assembly code
; etc.
xor ax, ax
ret
次に、Cから次のように呼び出すことができます。
extern int my_func();
// ...
int zero = my_func();
CodeWarrior Development Studio 10.5 のヘルプ メニュー ドキュメントには、C/C++ コード内から純粋なアセンブリ言語関数を呼び出す方法が次のように説明されています。
アセンブリ ファイルで定義されたラベルには、ローカル スコープがあります。他のファイル (.c ファイル) からそれらにアクセスするには、グローバルとしてマークする必要があります。たとえば、.global _my_asm_func
.
説明のために、コード スニペットの例を次に示します。
.global _my_asm_func
.text
_my_asm_func:
subq.l #4,a7
move.l d1,(a7)
add.l (a7),d0
addq.l #4,a7
rts
C/C++ コードで、最初に関数のプロトタイプを宣言します。たとえば、int my_asm_func(int a, int b);
. 次に、他の C/C++ 関数と同じようにその関数を呼び出します。たとえば、my_asm_func(5, 2);
.
アセンブリ コードでは関数の前にアンダースコアが付いていますが、C/C++ ではそうではないことに注意してください。これが必要なのか、それとも慣例なのかはわかりません。
パラメータはシーケンシャル データ レジスタに渡されます。この場合、5
inD0
および2
inにあることが予想されますD1
。
関数を呼び出す適切な方法を見つける最も簡単な方法は、同じ引数を使用してCで関数を記述し、内部で最小限の作業(各引数にアクセスし、結果値を入力)を実行して、アセンブラーにコンパイルすることです。関心のある各操作がどのように実行され、設定されているかを特定します。