質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

PCのVRAMに直接アセンブリ言語でデータを書き込む。

解決済

回答 8

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,320

carnage0216

score 133

題名に書かせていただいた通りPCのVRAMにアセンブリ言語でデータを書き込むことを考えた場合、
windowsの場合はwin32APIによって直接書き込むことは出来ないため、win32よ呼び出してVRAMに書き込みたいデータを渡して、win32がVRAMにデータを書き込むことで画面に文字や色が表示されると思います。
しかし、Linuxの場合はOS自体がオープンソースであるため、VRAMにデータを書き込む過程をアセンブリプログラムで見れるのでしょうか?
「書き込む」部分アセンブリプログラムで見れるかをお尋ねしたいです。
printfに関しては文字を表示する際に関係しているため質問をわかりやすくしようとしたつもりがかえってわかりにくい内容になってしまいました。すいませんでした。
どうかよろしくお願いいたします。

//編集内容//
VRAMにアクセスする上で壁が多くあることはよくわかりました。(多分)
そこで、過去にした質問を少し変えて改めて質問したいのですが、CPUからGPUを経由してVRAMにデータを書き込むPCであるという仮定で「CPUからGPUを経由してVRAMにデータを書き込みをするⅭプログラムをコンパイルに成功して実際に文字が表示できたとします。そのC言語プログラムをアセンブリプログラムに変換したとします。そのアセンブリプログラムはハードウェアに依存したものであるため、GCCでアセンブリプログラムとして実行してもCプログラム同じような結果が出ると思います。
得られたアセンブリプログラムをVRAMにデータを書き込むひな形のプログラムとして、そのひな形のアセンブリプログラムを参照に改造して別の文字を表すようにアセンブリプログラムで書いてGCCなどでアセンブリ言語としてコンパイルできれば、アセンブリプログラムでVRAMにアクセスでき文字を表せると思うのですが、(OSも関与してくると思いますが。)私の考えは間違っているでしょうか?
完全に一からアセンブリプログラムを組んでVRAMにアクセスするのは難しいですが、以上のようにできるならばVRAMにアクセスするのは難しくないと思います。

完全に一から使っているCPU、GPUの情報からアセンブリプログラムを組んでVRAMにアクセスするのは難しいですが、コンパイラによって出力されたアセンブリプログラムをそのまま使えばVRAMにアクセスするのは難しくないと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • carnage0216

    2018/03/12 21:03

    既に解答者の方々が上げて頂きましたが、再度言わせて頂きます。osありきのVRAM、osなしでのVRAM、osとBIOSなしでのVRAMへのアクセスただ、osとBIOSなしでのVRAMへアクセスの3つです。

    キャンセル

  • TaroToyotomi

    2018/03/13 00:01 編集

    質問の意味がよく分かりません。printf()関数は何故存在しているかという話ですか?話が発散して収拾がついていないです。

    キャンセル

  • carnage0216

    2018/03/13 00:20

    あの、printf関数は文字などを表示する関数だと昔通っていた学校で教わりました。しかし、そうではないようです。もし、printf関数が文字などを表示する関数ならばVRAMへアクセスして文字を表すのとあまり変わりはないのではないかと思いこんだだけですよ。不快な思いをさせてしまい申し訳ありません。

    キャンセル

回答 8

checkベストアンサー

+2

Linuxの場合はOS自体がオープンソースであるためVRAMに書き込むまでの過程を見ることができる

できるでしょうね。
この分野もw私は門外漢なので外してるかもしれないが、LinuxのウィンドウシステムはX Window Systemだと思うので、今ならX.OrgServer辺りから調べればVRAMに書き込む部分(ドライバ)まで辿り着けるかもしれない。ただグラフィックボード(ハードウェア)はいくつもあるので、物理ドライバも複数あるはずで、あなたのパソコンで動いているドライバがどれか、なんて知らないよ。

VRAMにデータを書き込む過程をアセンブリプログラムで見れる

見ることはできるでしょうが、上記ドライバはCで書いてるはずだから、動きを知るにはCのコードを読まない限り時間の無駄、実際はアセンブリコードを見ても何もわからないでしょう、これは請け合いだ(笑)。はっきり言って、VRAM操作のアセンブリコードを見ること自体にあまり意味は無いと思う。
GPUを操作しているのなら、GPUの仕様がわからないとCのコードを見てもちんぷんかんぷん、ましてアセンブリコードを見ても(Ry

それよりも、あなた自身が普通に書いたCプログラムをコンパイルしたアセンブリコードを見る、Cのコードのどこがどうなったか、大雑把でよいから掴めるようになる事が大事。

printf関数がもしOSに依存しているとしたら

全く依存しない、とは言いきれませんが、標準ライブラリなんだから、少なくともあまり依存しないように、移植性を考えて書くわけです。

アセンブリ変換すればVRAMに文字や色を表すためのデータを受け渡す部分が見れたり…

しません。printf()は絶対そんなことをしません。
なぜそう言えるか。処理には階層というものがあるから。

フォーマット文字列に従って、渡された引数を、表示すべき文字列に変換する、のがprintf()の本体であり、役目です。表示すべき文字列を作ったら、別の関数として用意された、文字列全体を表示する関数(或いはそろそろシステムコールかな?)のような物を呼び出して表示を行います。階層は2段階以上ある。

さらに、 main() { printf("hello world!\n"); }  をコンパイルして出来た実行ファイル(例えばhello.exe)は、そのままビットマップディスプレイにも、ssh等で繋がった別のパソコン画面にも、シリアルケーブルで繋いだ端末にも表示する…ばかりか

    $ hello.exe > message.txt


とすれば、ファイルに出力することもできます。このように、実行時に入出力先を切り替えることをIOリダイレクトと呼びます。もしprintf()の段階でビットマップに出力していたら、ファイルに出力したデータはビットマップになってしまう(笑)。
即ち、IOリダイレクトができるということは、ビットマップディスプレイに文字フォントを描き出す機能と、printf() は、実行時に連携して動作するのであって、遠く離れた・全く別の場所にあるコードだということを意味します。

念の為:処理には階層がある・・・階層を作る基礎がサブルーチンや関数ですよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/12 04:32

    y_waiwaiさん、僕は自分が頭がいいや頭、いいつもりとも思っていませんよ。
    どちらかというと悪いと思っています。
    ラズパイの情報ありがとうございます。

    キャンセル

  • 2018/03/12 08:25

    > 私の持っている本…では画像に線を書いたりするアセンブリプログラム

    な〜んだ、参考書があるなら、ぞれを試してみればよいだけじゃ???
    今もメインメモリの一部をVRAMにしてるらしく、GPUがあってもCPUはVRAMにアクセスしてるらしい、、、そうは言っても私はVRAMを読み書きする術を知らない。知らない人間に聞いてる暇があるなら、参考書通りにさっさとやればよいだけ、参考書がありながらグズグズしてるのは不思議ですらある呆

    キャンセル

  • 2018/03/12 11:05 編集

    おっしゃる通りですが、何しろ2005年と古かったため。
    そうですね。線書いたりしてるならVRAMへアクセスしてるかもしれないし、アクセスできるならば、そのコード自体が私の求めていたコードです。
    コンパイルエラーがあったら、地道に改良してみます。
    そうですね。
    まずは、gccでアセンブリプログラムの実行のコマンドを調べます。
    こんな私に最後まで回答していただきどうもありがとうございます。

    キャンセル

+1

Linuxならオープンソースなので任意の場所にデバッグ出力などを埋め込むことが出来ますから、挙動を見るのは多少容易になるでしょう。アセンブラレベルで見れればよいという話なら、デバッガを使えばLinuxだろうとWindowsだろうと挙動を見ることは出来ますね。

ただし今時のプログラムでVRAMを直接読み書きするのは極めて希です。通常はGPUに命令を送って指示をだし、GPUがVRAMに対して読み書きを行います。もちろん旧来との互換性のためにVGAモードなどで直接VRAMに対して読み書きすることは可能ですが、このためにはディスプレイドライバをVGA互換などに設定しておかないと挙動を見ることは出来ません。

予備知識が全くない状態で挙動を見るのは無茶でしょうから、下記のURL等を参照して予備知識を得ることをお勧めします。
Wikipedia INT 10H
INT 10H: Video Services

またprintf等の文字列の表示に限るなら、BIOS呼び出しで出力しており、直接テキストVRAMに触っていることはないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

回答が付いた後で編集する場合は元の内容も残しておいてください。あるいはどこをどう修正したかが判るようにしてください。質問と回答の内容がちぐはぐになってしまっています。

題名に書かせていただいた通りPCのVRAMにアセンブリ言語でデータを書き込むことを考えた場合、

アセンブリ言語でなければならない理由は何かおありなのでしょうか。「VRAMにデータを書き込む」ことと「アセンブリ言語でプログラムを書く」ことは別次元の話なので、分けて考えないと混乱します。

Linuxの場合はOS自体がオープンソースであるため、VRAMにデータを書き込む過程をアセンブリプログラムで見れるのでしょうか?
「書き込む」部分アセンブリプログラムで見れるかをお尋ねしたいです。

オープンソースなのだから、わざわざアセンブリプログラムに変換せずともソースをそのまま読めばよろしいでしょう。ほとんどの部分はCで書かれていると思います。
それと、VRAMにデータを書き込んでいるのはドライバーなので、見るべきなのはドライバーのソースということになります。ドライバーのソースを追っていけばいずれはVRAMに書き込んでいる部分にたどり着くと思います。
当然のことながらGPUによってドライバーは変わるので、お使いのドライバーに応じたソースを入手する必要があります。ただし、ドライバーによってはソースを公開していないかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/10 14:16

    > C言語プログラムを読んでからアセンブリプログラムを見ると言った段取りを組みたいです。

    いやいや、C言語のプログラムを見ればどのようにVRAMに書き込んでいるのかは判りますから、わざわざ手間をかけて読みにくくする必要はありません。というか、ソースにすべて書かれていますから余計なことはすべきではありません。

    > もちろん、使っているpcがGPUを使わずにVRAMにデータを書き込むようなものであれば、雛形を作る過程は変わってくると思いますが。

    GPUに接続されたVRAMはCPUでも直接書き込みできます。Linuxは知りませんが、WindowsのグラフィックAPIには、VRAM(API用語としてはサーフェイスメモリと呼んでいる)をCPUのアドレス空間にマッピングして直接アクセスできるようにする機能があります。CPUのアドレス空間にマッピングするので、単純なメモリアクセスになります。ただし、それはcarnage0216さんが思い描くものとは違うかもしれません。今時のPCはかなり複雑化しています。VRAMに何か書けば何か表示される、というような単純なものではありません。

    > 試行錯誤と推測によって得られたC言語、あるいはアセンブリ言語のソースからVRAMに書き込む事ができるかもしれません。

    今の状態では途轍もなく時間を浪費することになると思います。何度も繰り返している気がしますが、ソースを読み解くには前提となる知識が必要です。それ無しには、試行錯誤も推測も単なる当てずっぽうです。
    まずはC/C++と画面表示や描画関連のAPIを深いレベルで理解し、使いこなせるようになることが先決です。使えもしないものの仕組みを理解するなどできようはずもありませんから。

    キャンセル

  • 2018/03/10 14:25

    当てずっぽうはしたくはないです。言える立場ではありませんが。
    そうですね。システムコールがあるLinuxを使って勉強中なので、調べてみます。
    ただ、気になったのですが、Linuxを入れたpcにはGPUは搭載されていません。
    となるとGPUを使わないでディスプレイに文字を表示させるような別の機能があるのでしょうか?

    キャンセル

  • 2018/03/10 14:32

    CPU内蔵のGPUを使っているのでしょうね。PC向けに広く出回っているCPUには、GPUが内蔵されているものが多いです。

    キャンセル

+1

とても大雑把ですが一般的な汎用計算機の話から・・・

PCのVRAMにアセンブリ言語でデータを書き込む

これは現代的なOSの元では一般的に「不可能」です。それは例えばWindows/Linuxのカーネル、GPUメーカー提供のドライバー、OpenGLなどの全ての関連ソースプログラムを理解したとしても同じです。問題は「どのように描画しているかの処理の仕様がわかるかどうか」というレベルの話ではなく、「一般プロセスが計算機のハードウェア資源(I/Oデバイス)に自由にアクセスすることは許されていない」というレベルの話です。

なぜそうなっているかというと「現代的なOSは、一般のプログラムがどのようなバグを持っていても極力OSやハードウェアをダウンさせない」という思想で設計されているからです。

誤解をおそれずに言えば、一般プログラムはOSから「何か致命的なウィルスでも潜んでいるかのように」扱われ「勝手なことができないようガチガチに制限された中でしか動けない」のです。主記憶についても「勝手なアドレスに自由に読み書きすること」さえ許されていません。OSがお膳立てした「仮想的なメモリー空間上をアクセスすることだけ」が許されるような状況でのみ動作します。I/Oポートに直接アクセスすることもできません。その辺りを許してしまうと例えば「プログラミングを学ぼうとして、何かのプログラムをC言語などで書いて動かす」と簡単にOSやハードウェアが壊れる結果になりかねないのです。

まずは「このように安全性が配慮されているのが現代のOSである」という認識からスタートするのがよいでしょう。


さて、Raspberry Piはどうでしょうか?Linuxを動かすならある程度前述のような安全性が考慮されているとは思います。しかしながら、このハードウェアは「組み込み機器を手軽に構築できる」という思想で設計されていると思います。それゆえ一般の汎用計算機よりもハードウェアにもっと近い部分にプログラマーが接近する余地があるだろうと思います。

そういうわけでこの話題について調べるには「Raspberry Piではどうか」という前提条件が必須になると思います。で、Raspberry PiでそもそもVRAMに直接アクセスできるかを「Raspberry Pi VRAM direct access」で調べてみますと、「それが可能であるらしい」ように見えました。あるQ&Aの回答者が提示しているのは以下のプログラムがそのスタート地点だとのことです。

https://github.com/brianwiddas/pi-baremetal/blob/master/framebuffer.c

ただ、このレイヤーではVRAM=即ちピクセル単位の画素情報の読み書きが前提ですので、「文字をどうピクセルへレンダリングするか」という話題は出てこないだろうと思います。それはもっと抽象レベルに近い高水準機能に属することでその手法についていえば「フォントレンダリング」といったキーワードになるのではないでしょうか。

まぁ、しかしVRAMに何かを書きこみたいというのが質問者さんのやりたいことなのでしょうからそんな高度なフォントレンダリングを調べなくても「もっと素朴なやり方を自前で考えること」が可能だと思います。どんな画素パターンをVRAMに書けばいいかを考えればよいのです。

...**...
..*..*..
..*..*..
..****..
.*....*.
.*....*.
.*....*.
........


こんな素朴なパターンでも'A'には見えるんじゃないでしょか。ちなみに色については「VRAMのアクセスを直接やる」ならそのVRAMのフォーマットに全ての秘密があります。例えば3バイトでR,G,Bの順番に256諧調で画素値を指定できるようなフォーマットになっているのであれば、赤のピクセルを書き込むには0xFF 0x00 0x00という3バイトを所定の位置へ書き込めばよいですし、白にしたければ0xFF 0xFF 0xFFにすればいいです。

LinuxでならVRAMにデータを書き込む過程をアセンブリプログラムで見れると考えているのですが、この考えは間違っているでしょうか?
また、printf関数がもしOSに依存しているとしたらLinux同様にアセンブリ変換すればVRAMに文字や色を表すためのデータを受け渡す部分が見れたりするのでしょうか?

多分見ることができても、それを活用できるレベルまで理解するのは「大変困難」と言ってよいと思います。一般のOSによく出てくるTrueTypeフォントですが、その描画メカニズムを調べるだけで相当に難しいと思います。そんなものを調べていたのではいつまでたってもVRAMに書き込むプログラムの完成は見えてこないと思います。(もっと長期的にそのあたりのメカニズム・技術に挑戦するというのはそれはそれで一つの挑戦と思いますし、別に否定するような意見は持ってません)

しかし、'A'という文字コードから前述のビットマップフォントを得るぐらいなら自前でも充分作れるでしょうからそういうアプローチにしたほうがよいでしょう。LinuxやX11のソースコードを調べてconsole/terminalへ出力した文字列がどうレンダリングされるかを読み解こうとはしないほうがよいというのが自分の意見です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/10 14:26

    もしかしたら、アクセス制限
    とかやりたい事が出来ない事が多いため、マイコンやラズパイなどの規制の緩いものを使っているのかもしれないですね。
    pcはあくまでマイコンやラズパイを開発するためだけの環境として利用しているだけとか。

    キャンセル

  • 2018/03/10 15:41

    13:37 のコメントに対してGraphicsに関してコメントします。自分は専門家ではないので正確な情報ではないかも知れないことを最初にお断りします。

    今日のGPUのトータル性能はCPUには追い付けないほどのレベルに達してしまっていると自分は考えています。最早アプリケーションプログラマーがどう頑張ってもGPUのドライバーがやっている以上のことは不可能ではないかなぁという感じ。GPUはCPUに比べて馬鹿みたいに早いのでCPUでおいつけない計算をGPUでやってしまえという技術があるくらいです。

    今日のGPUが何十何百の内部プロセッサで3D処理を並列して処理しているということを考えると「そんなレベルと対抗したりそのメカニズムを解き明かそう」というのは少なくとも自分レベルでは無理そうです。

    > pcを使いこなしたい

    これは非常に奥深い意味を持っていると思います。どこまでやれば「使いこなしている」といえるか自分にはわかりませんが、質問者さんがおっしゃっていることはソフトウェアのみならずハードウェアの深い知識をも駆使してハード・ソフト両方を使い倒すということを意味しているのではないでしょうか?

    これについては自分はこう思います。「限定された世界でのプログラミング」もそれはそれでありだけど、それに満足せず知識領域を広げようとすればいくらでもマニアックな技術はごろごろ転がっている。Graphicsについては発展しすぎていてかみつこうとしても歯が欠けそうだけど(w;)知ろうとすればある程度の情報は得られるだろうし例え具体的なプログラムに結び付かなくてもそれは一つの知見となって残る。気持ちの持ちようだけど「そういう知見を積み上げていくことに満足を得たり価値を見出すことができるなら」挑戦する価値は充分ある。

    特定の成果を目指して邁進するプロの方の感覚と、楽しみでやっているアマチュアの感覚には大きな違いがあると思います。自分が上のように思うのはアマチュアゆえだと思います。

    キャンセル

  • 2018/03/10 22:57

    そうですか。
    考えが甘かったです。
    どうもありがとうございます。

    キャンセル

+1

PCのVRAMを簡単に触る方法はないのか?というと、ないこともないです。
「UEFIアプリケーション」は中身は単なるWindowsと同じPEなのですがUEFI(BIOS)によって起動され
BIOSの力を借りますが、VRAMに書き込みができます。

 利点

  • ドキュメントが公開されている(らしいですよ
  • フォーマットとしては、ほぼ単なるDLLなのでWindows用にDLLを作れる環境ならば作成可能(MSVCですら可能だとか)
  • 実機で起動する際にブートレコードが云々などを気にせず単純にFAT32にフォーマットしたUSBストレージの指定パスに置くだけでよい

参考
https://orumin.blogspot.com/2014/12/uefi.html
https://github.com/tenpoku1000/UEFI_FreeType_MSVC
http://wiki.phoenix.com/wiki/index.php/EFI_GRAPHICS_OUTPUT_PROTOCOL
http://wiki.phoenix.com/wiki/index.php/EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE
→FrameBufferBaseがVRAMの先頭アドレスになります。

以上の方法でUEFIアプリケーションからVRAMにほぼ直接書き込めるC言語のプログラムが作れます。
そしてそれを逆汗なりアセンブリ出力なりで出したものを雛形にしたものをアセンブラに通せばアセンブリでVRAMへ書き込めます。

デバイスを直接いじってる感はありますが、グラフィックドライバをアンインストールしたWindowsと同じ状態なので
低速(というかCPUに速度が依存する)であり、デバイスを使いこなしているかというと疑問です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/12 13:55

    本当にどうもありがとうございます。
    あの、自分も調べたのですが、BIOSを使わないでVRAMへアクセスしているみたいです。驚く事に2016年の資料なので、今現在のpcでも実装できるかもしれません。
    ただ、nasmというgccとは違うようなものを使っているので下調べが必要です。

    https://qiita.com/Wanwannodao/items/1d999aeb365397d08493

    キャンセル

  • 2018/03/12 14:09

    「BIOSを使う」の定義によるんじゃないですか?
    レガシーBIOSが起動時に割当および初期設定をしたものです。

    キャンセル

  • 2018/03/12 14:39

    あ、そうだったのですか。
    後は、os自作でC言語プログラムとアセンブリでVRAMにアクセスする方法ですね。
    http://osjisaku30.g.hatena.ne.jp/bluespear/20060728/1154057603

    キャンセル

  • 2018/03/12 14:47

    どちらも「MBRを用いたレガシーBIOS環境でのVRAM書き込み」です。
    アセンブラのみで作成できるというメリットはありますが、MBRへの書き込みが厄介なのが難点でしょう。
    2020年頃にはレガシーBIOS廃止したいとIntelが言ってるのも問題ですね。

    キャンセル

0

VARMで検索すればいくらでも情報が得られると思いますが、printf(アプリケーションによる文字出力)とVRAMとは直接結びついているわけでは有りません。大雑把に言うと、アプリ→システムコール(ドライバ?)→GPUに依頼→VRAMに文字の形のビットマップを作成して描画。ちょっと違うかもしれませんが、GPUによってVRAMの位置も違うしDMAの操作も違う。それをうまくやるのがドライバの役目ですd^^・・・昔Z80の頃はVRAMに直接描けたんですが;;・・・そもそも特権命令を使うアプリを実行できるのだろうか??

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

無駄にアセンブリにこだわっているようですが、C言語のポインタでハードウェアのI/Oに値を設定するのと、アセンブリのMOV命令で設定するのに本質的な差はないですよ。
また、ソフトウェアを駆使してハードウェアを制御する勉強をするなら他の方々もいっているようにARMやSHなどの組み込み向けマイコンでやった方が得られるものが多いと思います。

MMUやキャッシュ、メモリマップI/OなどPCではブラックボックスになっている部分を直接触ることができます。

ブートローダを作ったりイーサネットのTCP/IPプロトコルスタックを組んだりなど後々にすごく役に立つ経験になるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/11 20:19

    いえAVR用のgccがあります。
    https://www.clarestudio.org/elec/avr/

    キャンセル

  • 2018/03/11 21:35

    C言語が高級アセンブラとも言われるゆえんですね。

    キャンセル

  • 2018/03/11 21:47 編集

    もともとgccは、クロス・コンパイラの色が濃いコンパイラですから、m68k,m88k,vax,spark,mips・・・何でもありですねw

    キャンセル

0

Rasberry PI でも買ってきて、ベアメタル(OSなし)でVRAMをいじってみればどうです?
そうすればいかに自分が思い違いしてるかというのがわかると思いますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/12 14:45

    そうすれば、VRAMへのアクセス、いじる雛形のC言語あるいはアセンブリプログラムができると思います。

    キャンセル

  • 2018/03/12 14:49

    そう思うなら、机上の空論でぐだぐだするよりさっさと実行しましょう。

    いつまでこんな茶番をするつもりですか。

    キャンセル

  • 2018/03/14 01:09

    やってみて失敗するのが怖くて、実行できずにいたのです。
    はい、実行します。
    僕は皆様のように賢い人間ではないので難しいですが、頑張ってみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる