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

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

ただいまの
回答率

90.45%

  • アセンブリ言語

    117questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

  • アーキテクチャ

    91questions

    アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

  • CPU

    54questions

  • FPGA

    18questions

  • Verilog

    17questions

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

解決済

回答 6

投稿 編集

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

carnage0216

score 122

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/09 12:43

    画面表示に必要なアドレス等を入手します
    に関して、cpuとディスプレイにも同じように言えるとしたら、ディスプレイで文字を表すためのアドレスと文字データを送れば文字が表示されるというわけですね。

    キャンセル

  • 2018/03/09 13:41

    貼っていただいたurlを読ませて頂きました。
    あの、個人的に思ったのですが、文字や色を表示するのに大事なのはレジスタとかではなく、ディスプレイへのポートを流れるアドレスが重要なのでは無いかと思いました。
    アドレスとレジスタにあるデータによってディスプレイに文字や色を表示しているのではないかと思いました。

    キャンセル

  • 2018/03/09 14:14

    「アドレスとレジスタ」の意味がよく分かりませんが、ディスプレイに文字や色を表示するには、表示したい位置に対応するVRAMに表示したい色を表す値を書き込みます。それを文字の形に並べることで文字を表示します。

    なお、リンク先の記事が使っているST7735のデータシートでは、VRAMのことをDisplay Ramと表記しています。(Video(動画)を表示できるようなディスプレイではないのでVideo RAMと表現するのは適切ではないからでしょう。)
    Display RAMはAVRのメモリバス上に配置されるのではなく、I/Oポートを介して書き込むようです。

    理想はメモリバス上にVRAMがあるようなビデオカードを簡単に取り扱えるコンピュータを入手できるとベストですが、現代では学習向きのそのようなコンピュータとディスプレイは少ないようです。
    探してみたらないわけではなさそうです。
    http://www.nds-jpn.com/mono-lcd/graphic-mcu.html
    http://shop.cqpub.co.jp/hanbai/books/31/31401.html
    (他にもありますので「lcd内蔵マイコン」でググって見て下さい。)

    キャンセル

  • 2018/03/09 14:57

    私が言いたかったのはVRAMのピクセルのアドレスにデータを送る事で文字や数字を表現できるという事でしたが、
    cpuでもディスプレイのピクセルの座標のアドレスにデータを送る事で文字を表現できると思うのですが、だとしたらprintf関数の中身はピクセルのある座標のアドレスにrgbデータなどを送る事でhello worldなど表現できるのかもしれません。
    流石にprintf関数を自作はしませんが、自作osの本で文字をアドレスとrgbデータから作る項目があったので読んでみます。

    キャンセル

  • 2018/03/10 08:24 編集

    おはようございます。
    ディスプレイに文字や色を表示するには、表示したい位置に対応するVRAMに表示したい色を表す値を書き込みます。それを文字の形に並べることで文字を表示します。の説明でやっと理解できました。
    以上を考えるとレジスタうんぬんではなく、VRAMにデータが送れればどのレジスタを指定しても良いと考えています。(ハードの構造にもよりますが。)
    まあ、PCに関してのVRAMのメモリにどのようにアクセスするかは調べていないのでわかりません。
    もしかしたらI/Oポートに繋がったレジスタなどにデータを入れることで、VARMにデータを送ってくれるのかもしれませんが。
    Chironianさんに以前教えていただいたAVRマイコンとカラーLCDを使って何か作ってみたいと思います。
    そのあとにアセンブリ言語を使ってOPENCVなどと組み合わせて円検出をさせようと考えています。

    キャンセル

  • 2018/03/12 06:42 編集

    おはようございます。
    ベストアンサー後に申し訳ありません。Chironianさんが以前に使っていたAVRのマイコンはarduino nuoなどでしょうか?
    基礎勉強を兼ねてスタック、レジスタ、アセンブリ言語を学びたいと思います。
    arduinoでopencvであったり機械学習を行っている記事もあるので試してみたいと思います。
    arduinoなどのマイコンからいずれはPCのCPUやGPUの学習に移りたいと思います。
    アセンブリ言語に関してはarduinoはGCCとも対応していると聞きましたし、PCのCPUやGPUのアセンブリの言語の学習にarduinoでのアセンブリ学習も役に立つと思います。

    キャンセル

  • 2018/03/12 10:06

    私はarduinoが製品化される前にATMEGAを使っていたのでarduinoを使ったことはありません。
    しかし、情報がかなり多いですし、C/C++をベースとしたコンパイラが使えるようですから、コンピュータの基本的な仕組みを学ぶには向いていると思いますよ。
    頑張って下さい。

    キャンセル

  • 2018/03/12 10:52

    そうだったのですか。
    はい、頑張ります!
    ありがとうございます。

    キャンセル

  • 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 01:22

    どうもありがとうございます。
    表示において文字だとか数字だとか区別がないとのことですが、それはbitデータとしては区別されているのでしょうか?
    例えば000000001は文字のAを表すとして11110001は色の赤を表すようにできているのでしょうか?
    bitを駆使してCPUが物理的に区別できるようにしているのでしょうか?
    どうかよろしくお願いいたします。

    キャンセル

  • 2018/03/09 02:01

    CPU内部では別にbitデータで文字や色を区別しているというわけではありません。
    ものすごく簡単に言うと、画面表示に関してはCPUの仕事はデータポートのデータを指定されたアドレスに書き出すのみで、そのアドレスに接続されているグラフィックボードなどが、受け取ったデータを基に、文字を表示したり、色を付けたりします(実際にはTaroToyotomiさんが書かれているように、いちいちCPUが表示データをひとつひとつグラフィックボードに転送するような効率悪いことはせずに、DMAコントローラにデータをVRAMに転送するように指示を出すだけでしょうが)。

    キャンセル

  • 2018/03/09 02:19 編集

    ってことはアドレスを基に文字や色としてデータを適切な部分に送っているのですか?
    ではなくオペランドによって送ったものが文字か数字(数値など)かをCPUに伝えることができるということでしょうか?

    キャンセル

  • 2018/03/09 07:35

    例えば画像ファイル(*.bmp)とかの中身はRGB値の羅列で文字とか数字を意識してないでしょ?
    CPUの仕事はこのようなビットストリームをVRAMに転送することです。
    ディスプレイの表示に関してはグラフィックボードの仕事です。

    キャンセル

  • 2018/03/09 08:49

    ではVRAMにデータを送る専用のレジスタやディスプレイの表示に関してはグラフィックボード専用のレジスタがないとアセンブリ言語などで指定しないとビットストリームを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 08:39 編集

    #漢字ROM搭載!スクロールが早い!!というCM は初めて聞きました。w

    とある領域のメモリのナカミがそのまま画面に出る、と考えればいいですとのことですが、与えた二進数が文字コードなのか数字なのかを(アセンブリ命令とかで)伝えてあげなくては意味のある結果が表示されないのではないでしょうか?

    キャンセル

  • 2018/03/09 08:41

    いやー、Windows95が出る前の話ですからw
    #PC98がねー、といっても、なにそれ?で返されるきょーこのごろ

    キャンセル

  • 2018/03/09 08:43

    ディスプレイにそれを伝える必要がありません
    いまだしてるものが、小説なのかえろどーがなのかを、びでおかーどやらディスプレイやらに伝える必要はありませんよね?

    キャンセル

  • 2018/03/09 08:44

    はい、わからないです。ごめんなさい。

    キャンセル

  • 2018/03/09 08:45

    ってことは文字や数値を表す二進数は被ることがないのでしょうか?
    それゆえに伝える必要がないのでしょうか?

    キャンセル

  • 2018/03/09 08:57

    そこらへんちと勘違いされてるようですが、
    ディスプレイのユニットとしてはそれだけの仕事しかしてません。
    で、文字を表示するときには、
    文字>フォントファイルからその文字のビットパターンを抽出して画像データを生成>画像データを画面エリアに展開
    ということをすることになります。
    1 という数字と、1 という数字を写した写真データの区別はないし、区別できませんね

    キャンセル

  • 2018/03/09 09:28

    文字を表すにも数字を表すにもどちらも二進数であり、二進数の1ならばb00000001などと書いた場合これは二進数として、bがなくただの00000011と書いた場合は3として処理されるようなものですね。
    文字データの二進数は
    111000111000000110010011,111000111000001010010011,111000111000000110101011,111000111000000110100001,11100011,10000010,10001111
    だと「こんにちわ」となりますが
    上の二進数の111000111000000110010011はUTF-8では「こ」を表します。ただ数字で表すと「14909843」となります。アセンブリ言語で文字の「こ」を表したくて111000111000000110010011と打ったが、数字の「14909843」が出ないのかと心配になります。
    なにかCPUの方で以上のような区別ができないと数字か文字かどちらを表すのかわからないとかないのでしょうか?文字の「こ」を表したいのに数字の「14909843」と出ないのでしょうか?
    理解力が乏しくてすいません。

    キャンセル

  • 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/09 10:21

    あ、あのあくまで
    文字か数字かの区別をどのようにアセンブリ命令で行いCPUで動作しているのか知りたかっただけで、そこまで壮大なものはとても私では。

    キャンセル

  • 2018/03/09 10:22

    事前に文字列先頭へのポインタを渡すと決めておけば区別する必要なぞありません。

    キャンセル

  • 2018/03/09 10:34

    ちなみにOS自作は、それほど難しいものじゃないです。ただただ面倒なだけです。
    https://www.amazon.co.jp/dp/B00IR1HYI0/
    ちょっと情報が古く実際に作ろうとすると環境が大変ですが読み物としては面白いのでオススメです。

    キャンセル

  • 2018/03/09 10:45

    事前に文字列先頭へのポインタを渡すと決めておけば文字か数字かの区別ができるなんて、
    それってアセンブリ言語でもポインタみたいなものを渡せば文字か数字かをプログラマ自身が扱えるわけですね??

    キャンセル

  • 2018/03/09 10:46

    OSと言ったら30日自作OSか12ステップ8Hマイコンしか知りませんでした。

    キャンセル

  • 2018/03/09 10:48

    一回本屋で 文字表示の部分だけ読んでみて感動したのを覚えています。

    キャンセル

  • 2018/03/09 10:58

    int n = 42;のnは、値42をもつint型オブジェクト。
    char c = 'A';のcは、値0x41をもつchar型オブジェクト。
    のようにアセンブリ命令にも型があってそれで区別しているのですかね?

    キャンセル

  • 2018/03/09 11:38

    ちなみに、演算回路に関してもどのレジスタを経由しても演算回路につながっているのでしょうか?
    やはり、演算回路に数字のデータを送るための専用レジスタがあるのですか?

    キャンセル

  • 2018/03/09 11:40

    あるいは、アドレスやポインタを指定することによってどのレジスタに入れても演算回路に行くように出来ているのでしょうか?

    キャンセル

  • 2018/03/09 12:20

    レジスタに型はありません全て数値ですので、区別は不可能です。
    よって、このサブルーチン内では数値として扱う、文字として扱うなどと'事前'かつ'自主的'にルールを決めてそのようにプログラミングを行います。

    全てのレジスタが演算装置に繋がっているかはCPUの設計次第です。
    EIPやフラグレジスタなんかは演算できませんし

    x86の場合は汎用レジスタの加減算についてはできますが乗除算には制約があります。
    といってもlea命令で乗算についてほぼ回避でき、除算は乗算で代用できる事もあります。

    キャンセル

  • 2018/03/09 12:41

    文字として扱うなどと'事前'かつ'自主的'にルールを決めてそのようにプログラミングを行います。

    そうだったのですか、だとしたら文字が画面に表示されるようにアドレスなども自分で決めるしか無いのですか?
    なるほど、画面に数字が出てきても文字を事前に画面に表示させる事を考えれば、あるいみ正解なのですね。

    キャンセル

  • 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で質問しよう!

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

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

  • アセンブリ言語

    117questions

    アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

  • アーキテクチャ

    91questions

    アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

  • CPU

    54questions

  • FPGA

    18questions

  • Verilog

    17questions