ecall

ecall

RISC-V アセンブリ 参考

lyszt.netはecallおよびその他のRISC-V命令をより詳しく扱っています。

説明

ecallは、プログラムが動作する環境に対してサービスを実行するよう要求します。アセンブリは数値の加算や移動ができますが、画面、キーボード、その他のデバイスはプログラムをホストするシステムに属しているため、コードだけではそれらにアクセスできません。ecallはenvironment call(環境呼び出し)の略です。コードを停止し、ホストがサービスを実行し、制御がコードに戻ります。ホストは実ハードウェア上ではオペレーティングシステムであり、このシミュレータではシミュレータ自身です。

プログラムは必要なサービスを指定します。慣例により、サービス番号はa7に、サービスが必要とするデータはa0に入れ、その後ecallを実行します。このシミュレータは以下のサービスを提供します:1はa0の整数を出力し、4はa0のアドレスにあるテキストを出力し、5は入力から数値を読み取ってa0に入れ、10はプログラムを終了し、32はa0ミリ秒間一時停止します。

数値を出力するには、1をa7にロードして出力サービスを選択し、数値をa0にロードし、ecallを実行します。例ではこれを実行しています。サービス10はプログラムを終了させるため、レッスンは以下の2行で終わります。これがないと、プロセッサは最終行を越えて次に来るものへと続行します。

li a7, 10
ecall

RISC-Vマニュアルには、ecallは実行環境に対してサービス要求を行い、環境がパラメータの渡し方を決定し、通常は定義された整数レジスタで渡されると記載されています。このシミュレータがここでの環境であり、上記のサービス番号を定義しています。マニュアルはまた、ecallがかつてscallと呼ばれていたことも記しています。その相棒であるebreakは制御をデバッガに戻します。どちらも環境に対して正確な要求トラップを発生させます。

完全なオペレーティングシステムも同じように動作しますが、サービスのリストはより長くなります。

例

li a7, 1     # service 1 = print integer
li a0, 42
ecall        # prints 42