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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

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

Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

FPGA

FPGAは、製造後でも設計者によって書き換えができる論理回路です。即時に書き換えが可能なため、開発期間を短縮することが可能。何度でも書き換えられるといった柔軟性があるため、製造や開発における費用も削減できるといったメリットがあります。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

アーキテクチャ

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

Q&A

解決済

6回答

1375閲覧

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

carnage0216

総合スコア194

アセンブリ言語

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

Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

FPGA

FPGAは、製造後でも設計者によって書き換えができる論理回路です。即時に書き換えが可能なため、開発期間を短縮することが可能。何度でも書き換えられるといった柔軟性があるため、製造や開発における費用も削減できるといったメリットがあります。

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

アーキテクチャ

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

0グッド

1クリップ

投稿2018/03/08 15:46

編集2018/03/08 20:28

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rubato6809

2018/03/09 15:27 編集

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

2018/03/09 21:51

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

回答6

0

ベストアンサー

こんにちは。

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 03:05

編集2018/03/09 03:36
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/09 03:43

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

2018/03/09 04:41

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

2018/03/09 05: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内蔵マイコン」でググって見て下さい。)
carnage0216

2018/03/09 05:57

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

2018/03/09 23:25 編集

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

2018/03/11 21:42 編集

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

2018/03/12 01:06

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

2018/03/12 01:52

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

2018/03/12 03:08

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

2018/03/12 03:24

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

2018/03/12 05:00

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

0

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)と書かれていますので、

asm

1;$200に$1を書き込む 2lda #$1 ;white color 3sta $200 ;top left corner 4 5;$5ffに$5を書き込む 6lda #$5 ;green color 7sta $5ff ;lower right corner

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


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

投稿2018/03/09 02:44

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/12 03: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はアセンブリ命令なのですか? あまりみた事がないですが。
fuzzball

2018/03/12 04:10

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

0

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

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

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

投稿2018/03/09 23:37

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/12 04:57

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

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と書いてある画像
を取り出し合成した後にビデオデバイスに渡して画面に表示させます。

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

c

1#include <stdio.h> 2int main(void) 3{ 4 int32_t m0 = 0x0000304D; 5 puts(&m0); // => M0 6 return EXIT_SUCCESS; 7}

投稿2018/03/09 01:03

編集2018/03/09 04:13
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/09 01:21

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

2018/03/09 01:22

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

2018/03/09 01:34

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

2018/03/09 01:45

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

2018/03/09 01:46

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

2018/03/09 01:48

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

2018/03/09 01:58

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

2018/03/09 02:38

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

2018/03/09 02:40

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

2018/03/09 03:20

レジスタに型はありません全て数値ですので、区別は不可能です。 よって、このサブルーチン内では数値として扱う、文字として扱うなどと'事前'かつ'自主的'にルールを決めてそのようにプログラミングを行います。 全てのレジスタが演算装置に繋がっているかはCPUの設計次第です。 EIPやフラグレジスタなんかは演算できませんし x86の場合は汎用レジスタの加減算についてはできますが乗除算には制約があります。 といってもlea命令で乗算についてほぼ回避でき、除算は乗算で代用できる事もあります。
carnage0216

2018/03/09 03:41

文字として扱うなどと'事前'かつ'自主的'にルールを決めてそのようにプログラミングを行います。 そうだったのですか、だとしたら文字が画面に表示されるようにアドレスなども自分で決めるしか無いのですか? なるほど、画面に数字が出てきても文字を事前に画面に表示させる事を考えれば、あるいみ正解なのですね。
carnage0216

2018/03/09 23:51

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

2018/03/10 07:20

回答にも書きましたが > まず、CPUはOSが起動した後は保護モードと言い外部デバイス(マザボ・グラボ・HDD等)との通信やCPUのモード切り替えなどの命令をOS以外から受け付けないようになっているので > 画面に文字列を直接描画する方法を知ったところで無意味です. VRAMとひとくちで言っても解像度や色数によって使い方が変わります。 現代のCPUはマルチコアなのであなたの作成物だけが動いてるとは限りません。 あなたがVRAMに書き込んでる最中に他の人が解像度変更を行ったらどうなりますか? そういった事を防ぐためにもOSを通して他デバイスとやり取りを行っているのです。
carnage0216

2018/03/12 01:58

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

0

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

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

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

投稿2018/03/08 22:32

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/08 23:41 編集

#漢字ROM搭載!スクロールが早い!!というCM は初めて聞きました。w とある領域のメモリのナカミがそのまま画面に出る、と考えればいいですとのことですが、与えた二進数が文字コードなのか数字なのかを(アセンブリ命令とかで)伝えてあげなくては意味のある結果が表示されないのではないでしょうか?
y_waiwai

2018/03/08 23:41

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

2018/03/08 23:43

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

2018/03/08 23:44

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

2018/03/08 23:45

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

2018/03/08 23:57

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

2018/03/09 00:28

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

2018/03/09 00:38

それはビデオカードやディスプレイは全く関係ないことですね 私の前のコメントの、「フォントファイルからその文字のビットパターンを抽出して画像データを生成」に限る話です 心配しなくても、PCはそれぐらいの区別は付きます。 あなたがお母さんとお父さんを間違えないのと同じですな。 #どっちも同じ肉と骨の塊なのになんで区別つくんだ?と聞かれたらどう答えるでしょうか
carnage0216

2018/03/09 01:13

あ、よかった。 区別できるんですね。 どうもありがとうございます。 ちなみに、アセンブリ命令で数字か文字かを指定できるのですか?
y_waiwai

2018/03/09 01:17

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

0

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

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

投稿2018/03/08 15:58

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/03/08 16:22

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

2018/03/08 17:01

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

2018/03/08 18:39 編集

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

2018/03/08 22:35

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

2018/03/08 23:49

ではVRAMにデータを送る専用のレジスタやディスプレイの表示に関してはグラフィックボード専用のレジスタがないとアセンブリ言語などで指定しないとビットストリームをVRAMに転送したり、ディスプレイの表示などメモリに送れないのではないでしょうか?
YsMana

2018/03/09 00:23 編集

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

2018/03/09 00:32

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

2018/03/09 14:34

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問