こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

なぜソフトウェアでハードウェアが動くのか

組み込み機器のソフトウェア開発を行なっております。
ソフトウェアのようなテキスト文書で、なぜハードウェアが制御できるのかがわかりません。

例えば一般的なマイコンで
あるレジスタの値を1に書き換えることで
該当するポートの電圧がHになるという制御において
レジスタの値が書き換われば電圧がHになるというのはイメージがつかめるのですが
ソフトウェアでなぜレジスタの値が書き換わるのかがわかりません。

なるべく具体例でアセンブリ言語→機械語→レジスタが書き換わる
の対応関係を説明していただけると幸いです。
よろしくお願いいたします。

投稿日時 - 2008-04-07 23:01:05

QNo.3930857

困ってます

質問者が選んだベストアンサー

おもしろい(失礼)質問ですねー。基本の知識だけ抜け落ちてるんですね。
これからも組み込み開発するのなら、マイコンやデジタル回路については本を買ってひととおり勉強したほうがよいですよ。

さて、質問の答えですが、ぶっちゃけマイコンのハードウェアとはそういうふうにできているからです。
極論するとマイコンはあるところから数値を読み出して、何らかの足し引きをして、その結果をあるところに書き込む、ということを繰り返すだけのものです。その「あるところ」が時にはメモリだったりレジスタだったりするだけで。
どこからどこへどういう足し引きをするか、ということをずらずらと書き連ねたのがソフトウェアという命令書なのです。

ただマイコンは人間がアセンブラ言語で書いたテキスト文書(ソースコード)をそのままでは読めません。ですので、アセンブラという道具を使って、機械語という数値(バイナリコード)の並びに変換します。これをマイコンのメモリに置いてやってマイコンを動作させると、ソフトウェアが実行されたということになるのです。
で、その中にレジスタを1に書き換えろという命令(に相当する数値)があればそのとおりに実行します。

えらく単純に書くとこんな感じ。
人間の命令   レジスタ1234に1を書け
ソースコード  mov 1,(1234) (movは書けという命令)
バイナリコード 56 01 12 34 (56はmov命令に相当する数値)
マイコン    レジスタ1234に1をセット

わかりましたかね?
仕組みそのものをまじめに説明すると学校で一時間使って教えるようなものになるのでこんなところで。

投稿日時 - 2008-04-08 00:23:44

お礼

ご回答ありがとうございます。
おっしゃる通り基本知識がごっそり抜け落ちて、とりあえずはマイコンを使えるようになっている(つもり?)だけの状態です。
アドバイス通り一通り勉強したいと思います。

もう一点だけ伺いたいのですが
>えらく単純に書くとこんな感じ。
>人間の命令   レジスタ1234に1を書け
>ソースコード  mov 1,(1234) (movは書けという命令)
>バイナリコード 56 01 12 34 (56はmov命令に相当する数値)
>マイコン    レジスタ1234に1をセット
ここのバイナリコードまでは理解できるのですが、そこからマイコンがどのようにセットするのかのイメージがつかめません。
バイナリまではソフトウェアで、マイコンがセットするのはハードウェアだと思うのですが、その境界部分がよくわかりません。
本で勉強すれば理解できることかもしれませんが、とりあえず簡単に説明していただいてもよろしいですか?

投稿日時 - 2008-04-08 00:43:05

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

#3 への「お礼」の文章でちょっと気になったんですが, 「ソフトウェア」と「ハードウェア」を完全に別個のものとして認識していませんか? 特に, 「バイナリをハードウェアで記憶する」というところがすっぽり抜け落ちてるような気がします.
バイナリはハードウェアで記憶しなきゃならなくって, 今だと (最終的に) 電圧の H/L で記憶します (多分). この時点でハードウェアになってますね. あとは DFF (とか D ラッチ) の動作を考えるとか信号の流れを考えるとかすればわかる... かもしれない.
しかし, この状態で「組み込み機器のソフトウェア開発」ってできるんだ....

投稿日時 - 2008-04-08 15:08:14

ANo.5

CPUは、大雑把に言って、
A.1. プログラムカウンタ(PC)の指すメモリから命令を読む。
A.2. 命令を解析する。
A.3. 解析結果に従い演算する。
A.4. PCを進める。
という動作を繰り返します。これは解りますか?

ソフトウェア・プログラムというのは、CPUが読み込む命令列をメモリ上に置いたものです。
プログラムが実行されるのは、
B.1. メモリ上に命令列を書き込む。
B.2. CPUのPCが命令列の先頭を指すようにセットする。
という操作を行うからです。この操作を行えば、後はCPUが自動的にA.1~A.4を繰り返してプログラムが実行されます。

プログラムが実行されれば、A.3で言う「演算」が順次行われていきます。これには、レジスタの値を変更したり、メモリを読み書きしたり、あるいはI/Oポートを読み書きしたり、等を含みます。
従って、「演算」の結果、ハードウェアが制御されます。

さて、どこが解りませんでしたか?

投稿日時 - 2008-04-08 10:50:02

ANo.4

> とりあえず簡単に説明していただいてもよろしいですか

私には説明することは出来ませんが、この本が参考になるのではないでしょうか。

「CPUの作り方」渡波 郁 著、毎日コミュニケーションズ刊(2003.10)
http://www.amazon.co.jp/exec/obidos/ASIN/4839909865/ref=ed_ec_b_cs_15_4/249-5370846-8839510
(内容紹介)
『コンピューターの中核であるCPUという名のブラックボックス。その動作の「超」基本原理から設計までを4bitCPUを例に解説。アキバで手に入る部品だけで実際の制作も可能!実際に作らない人も読み物としてもタメになること請け合いです。』

投稿日時 - 2008-04-08 01:57:35

お礼

ありがとうございます。
ぜひ参考にさせていただきます。

投稿日時 - 2008-04-08 23:21:21

ANo.2

機械語は 0/1 の羅列ではあるんだけど, これを実際にはメモリに入れなきゃならなくって, メモリに入れた時点で (一般には) 電圧の H/L になってます. で, この電圧の H/L でプロセッサ内部のゲートを操作することによって (いろんな処理が行われて) レジスタを書き換えるわけです. つまり, 「誰がなんと言おうと最終的には電圧の H/L によって動いている」ということを頭に入れておくことになると思います.
なおむか~し昔には「内部のゲートの制御をずらっと機械語に書く」という, 今では想像できないようなプロセッサもあったそうです. 当然制御しなきゃならないゲートの数だけビット数が必要なので「1個の機械語がやたらとデカい」という問題 (1個の機械語が 1024ビット!) はあるわけですが, できる人が書けばおそらく最速でしょう.

投稿日時 - 2008-04-08 00:14:21

ANo.1

すべてのソフトウェアはその言語そのものの記載のまま動いているわけではありません。
あくまで人間が見やすいように記載しているだけです。これをコンパイラやリンカによって
機械語(0と1のカタマリ)に直して、これを元に動かすことになります。この機械語という
言語は、そのビット1個1個の構造自体が1つの命令およびシーケンス決定機能を持ってい
て、プロセッサ内部レジスタのどれを参照するのかとそれをどうするのかなどといった決め
事を実施する条件となり、その処理が終わったら次の命令を処理する(分岐命令の場合は分岐
先に移動する)といった処理を繰り返して動作させているものです。
組み込みソフトウェアの開発をされているのであれば、何らかの対象ハードウェアを知って
いると思いますので、そのプロセッサのアセンブラコマンドマニュアルなどを見てみること
をお勧めします。このアセンブラは機械語の1命令を1行で見易くしたものですので、実際
のハードウェア(プロセッサ内部レジスタ)をどのように動作させるのかといった動作内容が
1目で分かります。
当方は組み込みシステム開発なども行うハードウェア技術者ですので、あまり説明になって
いないかもしれませんが、参考まで。

投稿日時 - 2008-04-07 23:58:33

あなたにオススメの質問