ハードウェアアーキテクチャについて知りたい

このQ&Aのポイント
  • C言語の勉強を進めている中で、ハードウェアに近い根幹的な部分について知りたいです。動的メモリの確保や変数のパッキング、インラインアセンブラなどのテクニックに興味があります。
  • ハードウェアアーキテクチャの基礎知識やCPUの仕組み、メモリの動作など、ハードウェアに関する根本的な内容を学びたいです。
  • ハードウェアに寄り添ったプログラミングのテクニックや、ハードウェアアーキテクチャについての書籍やウェブサイトの情報を教えてください。
回答を見る
  • ベストアンサー

ハードウェアアーキテクチャ?

ハードウェアアーキテクチャ? プログラムがコンピュータで実行されるまでの筋道が知りたいです。 C言語を勉強していたのですがmalloc();などの動的メモリの部分や #pragmaを使って変数のパッキングを弄る方法、部分的にアセンブラ命令を書いて処理を軽くするインラインアセンブラなどのテクニック、 レジスタ上にメモリを確保するregisterをつけて変数を宣言する方法など、ハードウェアに近い根幹的部分のほうを知りたいです。 メモリにしろヒープ領域とスタック領域があるだとかC言語の入門書には載っていないことがよくあります。 CPUの仕組みや、メモリの動作や、根本的なことが知りたいです。 このようなハードウェア寄り?なことを専門に扱っているHPや本などありましたら教えてください。

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

  • ベストアンサー
回答No.2

まずは、「エキスパートCプログラミング」を読まれると良いかと思います。プログラミングのレベルからコンピュータの扱い方を勉強することが出来ます。 CPUやメモリなど、ハードウェアそのものに関しては、本気なら「コンピュータの構成と設計」通称「パタヘネ」(ヘネパタではない)を読み解くのがベストです。もうちょっとあっさり学びたいようでしたら、CPU系の本でパイプラインの項目がちゃんと書かれているものを選ぶとよいかと思います。 以上二つを学んだ上でなお知りたいことが尽きない場合、Code CompleteやBinary Hacksを読み、実践されていくと良いでしょう。 ある程度のレベルまでは本を読むことも良いのですが、段々、本では足りなくなってきます。あなたの興味は、丁度その境界あたりにあるように見えます。 今ならまだ、手当たり次第C++の本を読み漁ればそれなりに欲しい知識が得られそうですが、半年後は分からないですね。そのときはぜひ、一次資料を探したり自分で実験したり、勉強会で発表したりしてください。 蛇足ですが、個人的には日経BPの「なぜ」シリーズは好きになれません。IP電話は良かったですが、ハズレ本が多すぎます。

その他の回答 (3)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.4

ついでにもう一つ。 無料で受講できるe-learningの講座でも、こういうのがあります。 Webラーニングプラザ http://weblearningplaza.jst.go.jp/ ここの、情報通信 のカテゴリに、「コンピュータアーキテクチャコース」というコースがあります。 命令セットやメモリアーキテクチャの話が出てきます。ユーザ登録しなくても受講可能です。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

仕事では組み込み系の開発をしています。平たくいえば、マイコンの上で動くプログラムの開発です。 > メモリにしろヒープ領域とスタック領域があるだとか > C言語の入門書には載っていないことがよくあります。 入門書だから載っていないのだと思います。私は、この本でメモリ領域について知りました。 Al Stevens著:C++ Programming Bible, IDG Books India, 2000.  (日本語版があるかどうかはわかりません) #pragmaやインラインアセンブラは処理系依存です。私は、H8やSH2というマイコンを使っているので、ルネサスエレクトロニクスのC/C++コンパイラのマニュアルを読みながら覚えました。 http://documentation.renesas.com/jpn/products/tool/rjj10j2552_r0c40008xsw07rum.pdf しかし、Windows上やLinux上で動作するプログラムを開発するのであれば、下手な小細工よりコンパイラの最適化オプションのほうがはるかに強力です。処理速度の向上やメモリ消費量の低減をはかるのであれば、アルゴリズムやデータ構造を工夫したほうがよいでしょう。言い換えれば、プログラミング言語について大体わかったと思ったら、次はアルゴリズムとデータ構造です。 > CPUの仕組みや、メモリの動作や、根本的なことが知りたいです。 こういうものをお望みでしょうか? http://monoist.atmarkit.co.jp/fembedded/column/nakane/nakane03.html http://monoist.atmarkit.co.jp/fembedded/column/nakane/nakane04.html http://monoist.atmarkit.co.jp/fembedded/column/nakane/nakane05.html もっと一般的な話であれば、コンピュータサイエンスの教科書がお勧めです。情報の表現方法、ハードウェア、OS、プログラミング言語、コンピュータシステムの構成などを、広く浅く知ることができます。 知っておくべきキーワードは、こういうところから拾ってみてください。 http://www.ouj.ac.jp/hp/kamoku/H21/kyouyou/B/ningen/s_1542109.html いまならテスト配信中なので、上記の授業を無料で視聴できます。 http://www.u-air.ac.jp/hp/eizou/kamoku/computer.html

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.1

日経BP社の ・コンピュータはなぜ動くのか ・プログラムはなぜ動くのか のあたり。 ちなみに、上記は本当に「ハードウェア寄り」であって >malloc();などの動的メモリの部分や#pragmaを使って変数のパッキングを弄る方法、 >部分的にアセンブラ命令を書いて処理を軽くするインラインアセンブラなどのテクニック、 >レジスタ上にメモリを確保するregisterをつけて変数を宣言する方法など、 は「ソフトウェア(OSやC言語)寄り」の内容。 >CPUの仕組みや、メモリの動作や、根本的なことが知りたいです。 とはちょっと違う。

関連するQ&A

  • 組み込みアセンブラとは何ですか?

    私はx86でアセンブラを勉強中ですが、ネットでアセンブラ関係のことを検索していて組み込みアセンブラという記述をを見ました。 C言語から利用する場合インラインアセンブラより良いとかなんとか。 組み込みアセンブラという名前も怪しく合っているかわかりません。 掲示板のようなところで組み込みアセンブラの方が良い、早いと書いてありました。いろいろ検索して見かけたのでどこの掲示板かもわかりません。後から探したのですが見つけることができませんでした。 そこで質問なのですがそのその組み込みアセンブラとは何なんでしょうか? C言語からアセンブラを利用する場合、今読んでいる本「やさしいアセンブラ入門」にはインラインアセンブラとアセブラ言語モジュール(オブジェクトファイル)をCプログラムでリンクする方法の2種類が書いてありますが。組み込みアセンブラはモジュールで使うということでしょうか? 違うとすればどのような方法でアセンブラを利用することでしょうか? わかる方教えてください。ヨロシクお願いします。

  • C言語とアセンブラ言語による計算プログラミング

    "AB間の距離を求めなさい。" 下の画像において、AC=r1、BC=r2、∠ACB=α°とするとき、AB間の距離dを求めなさい。 上記の問題について困っております。 この問題の解答については、C言語とアセンブラ言語によるプログラミングで考えるようになっており、FPU(MATH COPROCESSOR)を使用し、C言語側で変数や関数宣言、printfなどでの計算結果出力を記述し、アセンブラ言語側で計算するプログラム問題です。 原則として、C言語側で計算してはいけない仕様になっています。 そして、2つのオブジェクトファイルをリンクさせ、実行可能ファイル(.exe)を作成し、コマンドプロンプト に計算結果を表示する。とういう問題です。 ・アセンブラ言語側での使用する命令のプロセッサアーキテクチャのタイプは「.386」 ・作成するオブジェクトのメモリモデルは、Windowsなので「FLAT」 図の画像は添付してあるので、どうかご回答のほどよろしくお願い致します。

  • c言語のメモリの確保について

    c言語で変数を宣言したり、領域を確保したりする場合に、メモリ上のこのアドレスに領域を確保する、といったように場所を指定することはできるのでしょうか?

  • 大学の卒業研究で以下のようなプログラムを作成することになったのですが、情報が少なく困っています。

    大学の卒業研究で以下のようなプログラムを作成することになったのですが、情報が少なく困っています。 「仮想マシンのアーキテクチャを定義、C言語でアセンブリ言語のプログラム をマシンコードに変換するプログラムを作成」 C言語については勉強済み。 アセンブラについては検索するとたくさん情報は得られるのですが、C言語でアセンブラを作るとなると話は別で。 どんな検索ワードで検索すればいいのか?などさっぱりです。 卒業研究なので、自分で考えるべきなのでしょうが・・・ どなたか、これに関連したサイト、実際にC言語で書かれたプログラム等をご存じでしたら、教えて頂けないでしょうか

  • 組み込みマイコンでのソフトウェアによるリセット

    組み込み用マイコン向けのファームウェアをC言語で 書いています. ここで, ソフトウェア側からマイコンにリセットをかけ るにはどのような方法があるでしょうか? ※マイコン自体には内部的なハードウェアリセットを行 う機能は無いものとします. 素人考えで思いつく限りだと: ・リセットを行う場所の関数からmainまですべて戻る 経路を作っておく. main (または, mainを呼び出すスタートアップルーチ ンの部分)をループにしておき, その始めで内蔵周辺 機能のレジスタやstatic領域のメモリをすべて初期化 するようなコードを ひたすらハードコーディングしておく. (※static領域のメモリ初期化はどのみち行うからよ いとして, 内蔵周辺機能のレジスタをひたすら初期化 するのが面倒に思われます) ・ウォッチドッグタイマ機能があれば, わざとカウン タをオーバーフローさせてハードウェアリセットをか ける. ・外部リセット端子に何らかの形で出力ポートを 接続しておいて, 自分でハードウェアリセットをかける. 上記のものでもやればそれなりに動作しそうな気は しますが, どういう方法が一般的なのか知らないため どうしてよいか悩んでいます. どのようにリセットを行うのがスマートであるか ご教示いただけませんでしょうか?

  • PICプログラム C言語とアセンブラ言語

    PIC18シリーズを使用して、プログラミングをしています。コンパイラはCCS-Cです。今まではすべてC言語で書いてきたのですが、アセンブラでしか設定ができない部分があり、今までのC言語のソースに加えてアセンブラを組み合わせようと思っているのですが、C言語とアセンブラを組み合わせることは可能なのでしょうか?

  • アセンブラの機能について

    今、アセンブラの勉強をしているのですがある書籍の説明文において 「ハードウェアすなわちコンピュータが用意している機能を原理的にはすべて使用してプログラムを作成できる。」 ということや、 「C言語などの高級言語には存在しない、ハードウェアに予め用意されている機能を利用してのプログラム製作が可能」 という記述があったのですが、具体的にアセンブラには高級言語には存在しないどのような機能が内臓されているのでしょうか? 私は多少C言語およびJavaの経験があるのですが、是非ともアセンブラとの比較を勉強したいと思い、この疑問が浮かび上がりました。 分かる方、よろしくお願いいたします。

  • c言語のmalloc関数、またrealloc関数

    c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。

  • プログラムとコンピュータ内部の物理的(?)な連携について

    C言語を使って、プログラミング作業をしている者です。 今、私は実務を通してC言語を使ったプログラミングを勉強している最中なのですが、自身で作成する場合は勿論ですが、他人が作ったプログラムを修正したりしていると、メモリの取られ方を意識して(或いはそのつもりで)、コーディングされているか(するか)イメージが掴みきれません。 VCを使って値だけの変化は分かりますが、変数がどんな時に(場所が複数ある場合)どこに確保されて、、、といったことがどうも分かりません。 C言語でのプログラムを理解するにはアセンブラ構造(スタックなど)を知っていれば、知らないよりは理解し易いと知り合いに言われ、本屋などで探しているのですが、イメージが掴みやすいように書かれているのがなかなか見当たりません。  C言語での命令を受けてCPUがどう動いているか(或いはどう動かされるように出来ているか)について何か「これは役に立った」とかそういった参考書なりサイトなりありましたらお願いいたします(今、「機械のコトバ」という書籍を読んでいます)。  過去ログでは近いと思い「アセンブラ」で検索してみましたが、「どうやってアセンブラ文法を学べばいいか」といったプログラミングそのものが殆どでした。  また、(まずは上記のことからですが)CPUだけでなくOSの役割についても知りたいので、何か良い参考書がありましたらそれについてもお願いいたします。

  • C++で、メンバもヒープに確保されていますか

    C++でどこまでヒープに確保されるのかが分からなくなる場合があります。 特に、配列がある場合や、クラスを使う場合newしてインスタンス作って使用する場合と、 そうでない場合があり、どこまでヒープ領域に確保されているのか 分からなくなってしまっています。 (開発環境 Visual Studio 2013等) Q1 クラス内の配列 class AA{ public: int x; int dat[10]; }; AA *a0 = new AA(); とする場合と AA a1; とする場合。 このとき、メンバ変数はそれぞれ、 a0->xはヒープ領域に確保 a1.xはスタック領域に確保 されるという理解で良いですか? そして、配列a0->dat[0]等 もヒープ領域に確保されていますか? Q2 クラス内にクラス class BB{ int u,v; AA aa; }; BB *b0 = new BB(); とした場合、 b0がヒープに確保されるとして、 b0->aaはヒープに確保されており、 b0->aa.xやb0->aa.dat[0]等もヒープに確保されているという ことで良いでしょうか? Q3 確認方法 変数等がヒープかスタック領域のどちらに確保されたかは どうやって見分けることができますか? アドレスの値から判断できますか? よろしくお願い致します。