ここから本文です

100枚out,in命令をC言語から使えるようにした(つもり)のですが、合っていますか?

changerさん

2020/3/3016:52:41

100枚out,in命令をC言語から使えるようにした(つもり)のですが、合っていますか?

void out(int out_number,int data){
__asm__ __volatile__(
"mov %2,%%edx\n\t"
"mov %3,%%eax\n\t"
"out %%al,%%dx\n\t"
:"=m" (out_number),
"=m" (data)
:"m" (out_number),
"m" (data)
);
}


int in(int in_number){
int return_status = 0;
__asm__ __volatile__(
"xor %%edx,%%edx\n\t"
"xor %%eax,%%eax\n\t"
"mov %1,%%edx\n\t"
"mov $0x00,%%eax\n\t"
"in %%dx,%%al\n\t"
"mov %%al,%0\n\t"
:"=m" (return_status)
:"m" (in_number)
);
return return_status;
}

閲覧数:
45
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

yuk********さん

2020/3/3115:38:39

人に聞かず自分でたしかめたらどうだろうね?
「つもり」じゃなく確信を持って書いたらどうだろうね?
そのために1から勉強し直したらどうだろうね?

inやoutってI/Oポートへアクセスするためのモノで、時にシビアな「タイミング」が要求されるわけだけど、そんなモノをいちいち関数に仕立てちゃったりして無駄なオーバヘッドを発生させて使いモンになるんかね?
それと、断りもなくレジスタを破壊しちゃってるけど、それってキミの使ってるコンパイラでは許されるんか?
そもそも、なぜそこまで関数に拘る? いいかげん「異種言語間のリンク方法」を学んだらどうだ?

  • 質問者

    changerさん

    2020/3/3116:10:09

    >断りもなくレジスタを破壊しちゃってるけど、それってキミの使ってるコンパイラでは許されるんか?

    すみません 付け足しました。

    >無駄なオーバヘッドを発生させて使いモンになるんかね?

    いちいちインラインアセンブリで書くのは面倒なのでC関数で定義したいです。

    >人に聞かず自分でたしかめたらどうだろうね?

    確かめようがないから質問したのですが・・・
    (今は関数を使わず直接インラインアセンブリでin,out命令を使っている。)

    >そもそも、なぜそこまで関数に拘る? いいかげん「異種言語間のリンク方法」を学んだらどうだ?

    どうしてもそれができなかったのでバイナリ形式に変換してから直接繋いでいます。
    ブートローダーはnasmに対応した書き方をしています。
    gccに対応した書き方なら
    Cで書かれたカーネルとリンクさせられますが
    今更書き直したくなかったので止めました。

  • その他の返信(3件)を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる