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

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

ただいまの
回答率

89.87%

CPUに含まれるレジスタがどのように働いて文字や色を画面に表示ているのかについて。

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,912

carnage0216

score 129

CPUなどには幾つかのポートが接続されていると思います。
例えば、文字を入力したら受け取るポートやディスプレイに文字などを表示するポートなどがあると思うのですが、CPU内に入力された文字を受ける取るだけの専用レジスタやディスプレイに文字を表示するためだけの専用レジスタがあるのでしょうか?
それ以外は多分、演算回路へ数値を送るための専用レジスタや値を一時的に維持するための凡用レジスタなどですかね。
そうでなければ、どのようにしているのでしょうか?
専用のレジスタを使わずに文字データや色をどうやってCPUで判断してデイスプレイなどに行くポートのレジスタを使っているのか知りたいです。
凡用レジスタなどをいかに工夫して文字や色のデータを表示したりしているのか気になります。
アセンブリ言語などでもウィンドウの画面全体を赤色で表示させるにもレジスタを指定すると思いますが、色のデータを扱うようなレジスタを指定したりするのかなど。
HELLO WORD をアセンブリプログラムにしてみましたが、

    .section .rdata,"dr"
LC0:
    .ascii "Hello, world!\0"
    .text
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
LFB10:
    .cfi_startproc
    pushl    %ebp     #
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp     #,
    .cfi_def_cfa_register 5
    andl    $-16, %esp     #,
    subl    $16, %esp     #,
    call    ___main     #
    movl    $LC0, (%esp)     #,
    call    _puts     #
    movl    $0, %eax     #, _3
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE10:
    .ident    "GCC: (MinGW.org GCC-6.3.0-1) 6.3.0"
    .def    _puts;    .scl    2;    .type    32;    .endef

pushl    %ebpから文字データをレジスタ%ebpに入れてからいろいろやっているのかと思いきや%ebpはスタックポインタなどのレジスタなので違うと考えています。
また文字データとは言え数値ですのでeaxレジスタにHELLO WORD と出るような(演算結果の)数値を入れてポートを経由して数値が文字として画面に表示されるのかなとも考えています。

出来る限り詳しく説明して頂けると大変勉強になります。

CPU内に入力された文字を受ける取るだけの専用レジスタやディスプレイに文字を表示するためだけの専用レジスタから(例えばA)ポートを使ってたり、
CPUの文字を受け取る専用レジスタに文字データを入れたり、入力した文字を(例えばB)ポートを経由してディスプレイに文字を表示する専用のレジスタに文字データやRGBのデータを入れているのでしょうか?
ただ、文字も色も数値でしかないので、
文字を表す数値の時は、色を表す数値の時は、どこどこのレジスタを通るなど、物理的にCPUやGPUであらかじめ製作者側によって作られているのかもしれませんね。

長文の質問になってしまいましたがどうかよろしくお願いいたします。

//編集内容//
例えば‘A‘という文字を表示するため、Aの二進数データをデイスプレイに表示するためにアセンブリ命令でどのように命令するのでしょうか?どのレジスタを指定してもいいのでしょうか?
どのレジスタを指定してもいいとしてもデイスプレイに文字を表示するためのポートやメモリを指定するのでしょうか?
先ほどPICマイコンとLCDモジュールの解説について読んでいました。
PICでは自分で出力ポートが決められ、そのポート先にLCDを取り付ければ文字を表示することができます。CPUの場合はマイコンとは違い複雑ですが、文字を表示するための出力ポートはあると思います。
そのポートはマイコンと違って製作者が決めているため、どの出力ポートを使えばデイスプレイに文字が表示されるかわかりません。
またアセンブリ言語でレジスタを指定できても、出力ポートまでは指定できないと思います。
なのでその出力ポートと繋がったレジスタに二進数のデータを入れれば、レジスタからポートを経由して二進数データに対応した文字をデイスプレイに表示してくれるのではないかと考えました。
正直アセンブリ言語でどこまで直接動かせるかはわかりませんが、CPUで文字として扱うようにbitを立てるなどする、えーと、文字などを扱う時のオペランドを使ってデータを扱えば、コンパイラでオペランドが二進数されたときのオペランドのbitによってCPUのほうに文字データを扱っていること指定する。
このオペランドによってどのレジスタを関与してもオペランドのbitデータによってちゃんと文字データとしてCPUで扱われ文字のデータをレジスタから文字をデイスプレイに表示するためポートへ送られ、結果としてデイスプレイに文字が表示されるのかなとサイトを調べていて考えました。
もし以上のことが全く違うとすると、レジスタと演算回路では所詮、数値を求めるだけであり、その数値をどのように(アセンブリプログラムなどで)扱って文字データだよとCPUに認識させる?というか扱わせるのかなと疑問があります。

いったいどのようにアセンブリ命令すればCPUのほうでデータを文字データとして扱い、なおかつその文字データをデイスプレイに表示してくれるのでしょうか?
アセンブリ命令で文字データであることやその文字データを指定したレジスタに入れること、そして指定したレジスタからデイスプレイに表示するためのポートなどまで指定して、文字をデイスプレイに表示できるのでしょうか?

編集内容となってしまいましたが、どうかよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • rubato6809

    2018/03/10 00:24 編集

    疑問点が発散しすぎ。画像バッファ(VRAM)のこと、入出力ポートのこと、文字表示/数字表示のこと、文字コードのこと、アセンブリコードに固有の問題なのかC言語で調べられることなのか、、、。もうありとあらゆる範囲に関わる疑問を、手当たり次第に発してる感じ。どの疑問も中途ハンパな回答しか得られていないと思う。今回の質問はこの疑問、と絞ること。疑問がたくさんあるなら、別の質問として投げれば良いと思う。

    キャンセル

  • carnage0216

    2018/03/10 06:51

    どうもすいませんでした。質問を編集します。

    キャンセル

回答 6

checkベストアンサー

+2

こんにちは。

CPUに含まれるレジスタがどのように働いて文字や色を画面に表示ているのかについて。

まず、CPUに含まれているレジスタは画面表示と直接的には全く無関係です。

ざっくりですが、グラフィックカード上のVRAM(ビデオRAM)の内容をグラフィックカード上のLSIが液晶ディスプレイが受け取ることができる信号形式で出力し、それを液晶ディスプレイが表示します。

(以下は仮想の話です。具体的な部分は現実とは一致していません。考え方を説明するための1例として捉えて下さい。)

VRAMはグラフィック・ドライバが動作しているメモリ空間上の例えば0x8000番地からに配置されます。0x8000番地からの3バイトには画面左上(0, 0)座標のピクセルの色が書かれます。RGBの順序でそれぞれ0~255の値でしめされます。全て0なら黒、全て255なら白、Rのみ255でGとBが0なら赤で、(0, 0)座標のピクセルが表示されます。
効率のため1バイト空けて0x08004番地からの3バイトは(1, 0)座標のピクセルの色が同様な方法で記録されます。
グラフィック・カード上のLSIはこのVRAMをスキャンし、表示先がアナログディスプレイなら、D/AコンバータにてRGBの3色のデジタル値を電圧へ変換して液晶ディスプレイへ送るわけです。

NVIDIAコントロールなどにリフレッシュ・レートとして60Hzなどと設定できますが、これは1画面を1/60秒(=約16.6mSec)でスキャンして表示しています。つまり、グラフィック・カード上のLSIはVRAMの1画面分のエリアを1/60秒毎に読み出して液晶ディスプレイへ送っています。
そのスキャンの合間を縫って(もしくは2ポートVRAMならば同時に)CPU側からVRAMへ書き込むことができます。それにより画面に表示する内容を更新します。

現代のディスプレイは大抵ビットマップ・ディスプレイですから、Windowsはがある文字を表示する場合、その文字コードに対応する文字のビットマップ形式のパターンをフォントを使って生成し、それを表示したい座標に対応するVRAM上へ書き込みます。

これらの処理自体はCPUが行いますが、CPUにとっては単にRAMへデータを書き込んでいるのと同じです。
CPU自体はそのRAMがVRAMなのか通常のメイン・メモリなのか区別しないで処理します。それを区別するのはWindowsシステムや表示を行うアプリです。

以上の基本的な仕組みについては、例えばTFT液晶LCD+AVRマイコンで自作フォントを表示等の記事を参考に自作すると非常によく理解できると思います。
最終的にPCでやることを目指す場合は、それでは全く不足ですので、そのあたりに詳しい方のところに「弟子入り」して教えて頂くようなことが必要になるかも知れません。
なお、「弟子入り」は、そのような開発を行っている会社でそのような部署でそのような仕事の担当として配属されれば、教育を受けることができるだろうとの意味です。そのためには、最低でも基本的な仕組みくらいは自力で身につけておかないと厳しいだろうと思います。


【補足】
「TFT液晶LCD+AVRマイコンで自作フォントを表示」では、LCDへ送るためのポートとしてPORTBPORTCをハードコーディングしています。Windowsでは、Plag and Playの超複雑な仕組みを使ってディスプレイ・ドライバのインストール時に自動的に決定し、その値をレジストリへ記録しています。ディスプレイ・ドライバはレジストリを読み出して、画面表示に必要なアドレス等を入手します。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/12 12:08

    ちなみに、ラズパイなどはお使いになった事はありますか?

    キャンセル

  • 2018/03/12 12:24

    いえ、ラズパイもないです。
    ラズパイが流行りだすより前にArmadillo(https://armadillo.atmark-techno.com/)を使ったことがあります。Android用の入力デバイスの開発でした。その時、linuxのカーネルとデバドラを少し読みました。若干のハードウェア制御も行いましたが、アセンブラを読む必要は事実上ありませんでした。

    キャンセル

  • 2018/03/12 14:00

    そうなのですか。
    アルマジロ、初めて聞きました。

    キャンセル

+2

6502asm.comを開きます。

ヘルプを見ると、

The address space for the screen is from $200 (top left corner) to $5ff (lower right corner). For your convenience the screen is 32 by 32 pixels - 1024 in total.

左上が$200で右下が$5ff、32x32ドットの画面(VRAM)と書かれていますので、

;$200に$1を書き込む
lda #$1   ;white color
sta $200  ;top left corner

;$5ffに$5を書き込む
lda #$5   ;green color
sta $5ff  ;lower right corner

と打ち込んで、CompileRunすると、右の黒い画面に白と緑のドットが表示されます。
楽しいねw


ハードを直接触りたいなら、こういうシンプルなエミュレータとか、昔のPC(8bit機)のエミュレータなんかで遊ぶのがいいですよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/12 12:09

    解答ありがとうございます。
    あの、
    ;$200に$1を書き込む
    lda #$1 ;white color
    sta $200 ;top left corner

    ;$5ffに$5を書き込む
    lda #$5 ;green color
    sta $5ff ;lower right cor
    のstaやldaはアセンブリ命令なのですか?
    あまりみた事がないですが。

    キャンセル

  • 2018/03/12 13:10

    いちいちコードを全文引用する必要がありますか?(最後の二行だけで十分でしょう)

    キャンセル

0

グラフィックボードなどに実装されているビデオメモリ(VRAM)に表示する内容(座標や色)に応じてビットを立ててるだけだと思います。
表示において文字だとか数字だとか区別はありません。
VRAMに表示データを転送するにはDMAが使われていると思われます。

https://ja.wikipedia.org/wiki/VRAM

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/09 09:18 編集

    グラフィックボード専用のレジスタなんてありません。
    周辺機器を制御するのに、それぞれ専用のレジスタが必要だとしたら、
    マウス、キーボード、将来出現するかもしれない未知のデバイス、など全ての周辺機器に応じて専用レジスタを準備するという到底不可能なことが必要になってしまいます。

    周辺機器の制御にはMemory Mapped I/Oを使っています。

    キャンセル

  • 2018/03/09 09:32

    共用のレジスタを使うにしてもアドレスが振り分けられていて、あるアドレスはマウスからしか出なかったり、また別のあるアドレスはキーボードからしか出ないので、CPUでもアドレスを基に判断できるとかで専用のレジスタがないとかですか?
    Memory Mappedにアドレスなどを収納して。

    キャンセル

  • 2018/03/09 23:34

    ラズベリーパイ(Linux)だとフレームバッファを経由して直接ディスプレイに描画することができるようです。デバイスドライバを書かなくてもできるようなので簡単に試せると思います。
    https://qiita.com/take-iwiw/items/0a7a2fefec9d93cdf6db

    キャンセル

0

よのなかそんなに難しいもんじゃありませんw
#しょせんは人間が作ってるもんですし

とある領域のメモリのナカミがそのまま画面に出る、と考えればいいです
32ビットカラーなら1ワード(32bit)が1ドット、16ビットカラーなら1ワードが2ドット、というふーにメモリを書き換えればそれがそのまま画面に出る、と。

むかし、CPUの処理能力が低い頃は、文字のドットパターンを格納しているROMを介することで、メモリに文字コードを書くとその文字が画面に出る、というようなことをやってた時代もありましたが、
#漢字ROM搭載!スクロールが早い!!というCMを覚えてる人は、、いませんかw
今はもう廃れた技術になってしまいました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/09 09:38

    それはビデオカードやディスプレイは全く関係ないことですね
    私の前のコメントの、「フォントファイルからその文字のビットパターンを抽出して画像データを生成」に限る話です
    心配しなくても、PCはそれぐらいの区別は付きます。

    あなたがお母さんとお父さんを間違えないのと同じですな。
    #どっちも同じ肉と骨の塊なのになんで区別つくんだ?と聞かれたらどう答えるでしょうか

    キャンセル

  • 2018/03/09 10:13

    あ、よかった。
    区別できるんですね。
    どうもありがとうございます。

    ちなみに、アセンブリ命令で数字か文字かを指定できるのですか?

    キャンセル

  • 2018/03/09 10:17

    文字コード、でぐぐってみましょう

    キャンセル

0

まず、CPUはOSが起動した後は保護モードと言い外部デバイス(マザボ・グラボ・HDD等)との通信やCPUのモード切り替えなどの命令をOS以外から受け付けないようになっているので
画面に文字列を直接描画する方法を知ったところで無意味です.

以前も言いましたが、そんな身勝手な事をやりたければOS自作しましょう。

OSはメモリ上にCPUを使って送られてきた文字列のポインタを元に絵を書いて
出来上がった絵をGPUに渡しているのです。


段々、あなたの抱いている誤解が理解できてきました。

まずCPUの世界に文字列なんてものはありません。
CPUができるのは数値計算をして結果をどこか外部に伝えるだけです。
(そして外部に伝えるのはOSの仕事になりユーザーがどうこうできるものではないので割愛)

 puts("M0"); を考えます。

M = 0x4D
0 = 0x30
文字列終端 = 0x00
と事前に決めておきます。
"M0"は4D 30 00 という3byteへのポインタになります。

puts("M0")からポインタを受け取ったOSは頭から1byteずつ取り出して
内部にあるフォントデータ(原始的にはビットマップの配列)
font[0x4D] = Mと書いてある画像
font[0x30] = 0と書いてある画像
を取り出し合成した後にビデオデバイスに渡して画面に表示させます。

ちなみに数値を渡すってこんな感じでしょうか?

#include <stdio.h>
int main(void)
{
    int32_t m0 = 0x0000304D;
    puts(&m0); // => M0
    return EXIT_SUCCESS;
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/10 08:51

    ポインタでVARMを指定してデータを書き込むことは出来ないのでしょうか?

    キャンセル

  • 2018/03/10 16:20

    回答にも書きましたが
    > まず、CPUはOSが起動した後は保護モードと言い外部デバイス(マザボ・グラボ・HDD等)との通信やCPUのモード切り替えなどの命令をOS以外から受け付けないようになっているので
    > 画面に文字列を直接描画する方法を知ったところで無意味です.

    VRAMとひとくちで言っても解像度や色数によって使い方が変わります。
    現代のCPUはマルチコアなのであなたの作成物だけが動いてるとは限りません。
    あなたがVRAMに書き込んでる最中に他の人が解像度変更を行ったらどうなりますか?

    そういった事を防ぐためにもOSを通して他デバイスとやり取りを行っているのです。

    キャンセル

  • 2018/03/12 10:58

    複雑化したCPUを使うって難しいですね。痛感しました。
    ただ、画面に文字列を直接描画する方法を知ったところで無意味です.に関しては、CPUやGPUの構造の勉強になるため無駄ではないように思えます。素人が口を出してすいません。
    マイコンとVRAMに関してはVRAMのマイコンのアドレスによって文字を送ったのか数字を送ったのかを判断しているようですね。

    キャンセル

0

画面表示機能はCPUの機能ではありません。

CPUの機能はあくまでも演算処理です。他の機能は他の装置が担当しています。CPUの演算結果に応じてバスの状態が変化しますので、これを他の装置が検出して動作する仕組みとなっています。

つまり、CPUだけの立場からすれば、「どの数値が色に対応する」というようなことは考える必要がありません。プログラマが両方のルールを理解したうえで、ロジックを作っています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/12 13:57

    演算処理だけで、医療機器や人工知能を再現するとは...
    CPUはすごいですね。

    キャンセル

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

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

同じタグがついた質問を見る