私はリアルタイムクロックを読むためのインラインアセンブリコードを書いています。私は 'dl'に読み込まれるレジスタ番号(4)をロードし、これをポート0x70にロードしています。私はこのレジスタ値(4)をalに読み込もうとしています。詳細については - RTCGNUアセンブラの構文
asm(
"mov $4, %%dl;"
"out 0x70, %%dl;"
"in %%al, 0x71;"
:
:
:"%al","%dl"
);
私はこのコードが含まれているCファイルをコンパイルするには、以下のエラーメッセージを取得しています。
Assembler messages:
Error: operand size mismatch for 'out'
Error: operand size mismatch for `in'
アセンブラバージョン:GNUアセンブラバージョン2.26.1(x86_64版 - のlinux-gnuの)(UbuntuのためにGNU Binutilsの)BFDバージョンを使用して2.26.1
誰かが問題を指摘していただけますか?
エラーメッセージは、定数の前に '$'がないためです。つまり、asmに値を出力させたい場合は、最初のコロンの後に出力パラメータを設定する必要があります。あなたがUbuntuを実行しているときに 'in'または' out'を使うことができれば、私は驚くでしょう。 RTCを読む前に 'cli'するつもりはありませんか?そして、もしあなたが16ビットコードを構築しているなら、私は64ビットコンパイラを使うことがうまくいかないと思っています。また、ブート時にRTCを読み込もうとしている場合は、[こちら](https://stackoverflow.com/q/46074535/2189500)をご覧ください。 –
AT&Tの構文では、通常、右側に宛先があります。私は、IN命令とOUT命令も同様に期待しています。 'IN 0x71、%% al'? –
@DavidWohlferd 'iopl()'や 'ioperm()'システムコールを使って 'in'と' out'を使うことができます。 – fuz