- ベストアンサー
アセンブラの機能について
今、アセンブラの勉強をしているのですがある書籍の説明文において 「ハードウェアすなわちコンピュータが用意している機能を原理的にはすべて使用してプログラムを作成できる。」 ということや、 「C言語などの高級言語には存在しない、ハードウェアに予め用意されている機能を利用してのプログラム製作が可能」 という記述があったのですが、具体的にアセンブラには高級言語には存在しないどのような機能が内臓されているのでしょうか? 私は多少C言語およびJavaの経験があるのですが、是非ともアセンブラとの比較を勉強したいと思い、この疑問が浮かび上がりました。 分かる方、よろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
C言語等では直接制御できず、原則としてアセンブラでなければできないものを挙げると、 ・メモリマップの詳細に関わる設定 ・キャッシュの操作 ・TLB等、MMUの操作 ・割り込みやCPU例外の制御 ・コンテキストの切り替え(プログラムカウンタやスタックポインタ等の設定・取得) ・非メモリマップドI/Oの制御 ・レジスタファイルの制御(裏レジスタへの切り替え等) ・微細なタイミングの制御 ・パイプラインや並列処理に関する制御 ・ステータスフラグの制御 といったところでしょうか。 これらの多くは、プロセッサのアーキテクチャに強く依存しますので、最大公約数的な仕様を持ち、かつずっと昔に規格化されたC言語等では当然サポートされません。 もちろんC言語でも、処理系の独自拡張を使ったり、(アセンブラで記述された)ライブラリ関数を利用すれば可能になることもあります。
その他の回答 (6)
考え方が逆です。アセンブラには、そんなしゃれた機能などはなく、全てを自分で作る 必要があります。メモリ空間のどこにプログラムを置き、データ領域はここで、変数は ここに配置…ということも、全部プログラマが決めないといけません。 レゴブロックを想像すると、解りやすいですかね? VBは、ブロック一個がすでにある程度の形になっているので、楽に組み上がります。 その代償として、造形の自由度は低いです。 C,C++は、ブロックが小さく、形も基本的なので、自由な形を作れますが、VBよりも 手間がかかります。 アセンブラは、C,C++よりもさらにブロックが小さく、いかなる形でも作り上げられます。 しかし、造形には膨大な手間がかかります。 C,C++でできないというのは、今あるブロックで作れない形がある、という比喩になり、 これはライブラリを追加すれば可能になります。 繰り返しになりますが、アセンブラは一番基本的な形しかなく、全て手作りするから あらゆる処理が可能なのです。
お礼
予想以上にみなさまが詳細な返答をしてくださり、とても感謝しております。 各人一人づつお礼の言葉を言わせていただきたいところではありますが、大勢のためうっとおしく感じられる方もいらっしゃると思いますので、もうしわけありませんがこちらの方で、みなさんにお礼の方を述べさせていただきたいと思います。 みなさまありがとうございました! 私の疑問に思っていた問題はこれらの回答により、解決・理解することができました。 また何かありましたら、次回もご教授の方をよろしくお願いいたします。
- ymmasayan
- ベストアンサー率30% (2593/8599)
> 具体的にアセンブラには高級言語には存在しないどのような機能が > 内臓されているのでしょうか? この答えは非常に難しいです。 一口にアセンブラーといっても星の数ほど種類があり、 一方、高級言語も種類が沢山あります。 従って例を挙げるのは相当難しいですね。 ここで、2つのことについて示しておきます。 1.高級言語はコンパイルすると大抵はまずアセンブラーに変換した後 機械語にします。 コンパイラはいろんな種類のアセンブラー命令を使用します。 もちろん使わない命令も多いです。 多いものでは数百種類の命令語を持ちますから当然です。 2.高級言語の中でもC言語だけは特別です。 他の高級言語よりもアセンブラーに近い命令文を沢山持っています。例えばシフトとか。 これはC言語がもともと「UNIX」というOSを書くために作られた言語だという 歴史があるからです。 そういう意味で、C言語はアセンブラーに近い小回りが利くようになっています。 また、プロの使う言語という香りも強いです。 エラーチェックなどが極力省いてあるので、初心者は苦労させられますね。 JAVAもC++もC言語がベースになった言語ですから 他の高級言語に比べるとやっぱり異色です。
お礼
予想以上にみなさまが詳細な返答をしてくださり、とても感謝しております。 各人一人づつお礼の言葉を言わせていただきたいところではありますが、大勢のためうっとおしく感じられる方もいらっしゃると思いますので、もうしわけありませんがこちらの方で、みなさんにお礼の方を述べさせていただきたいと思います。 みなさまありがとうございました! 私の疑問に思っていた問題はこれらの回答により、解決・理解することができました。 また何かありましたら、次回もご教授の方をよろしくお願いいたします。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>アセンブラには高級言語には存在しないどのような機能が内臓されているのでしょうか? 汎用な言語としては、アセンブラは存在しない(それぞれのCPUに依存するため。GASは別か?)ので、アセンブラの機能というより、アセンブラが1対1で対応するCPUの機能を直接使えるという意味でしょう。 例えば、一般のプログラム言語ではレジスタを指定してのプログラムやスタックポインタやプログラムカウンタを直接プログラムからいじったりすることはできませんし、そのCPU特有の便利な命令があったとしても、言語としての汎用性からその命令に依存するようなものは言語に含めることができません。 まあ、おおむねそういうような意味かと思います。
お礼
予想以上にみなさまが詳細な返答をしてくださり、とても感謝しております。 各人一人づつお礼の言葉を言わせていただきたいところではありますが、大勢のためうっとおしく感じられる方もいらっしゃると思いますので、もうしわけありませんがこちらの方で、みなさんにお礼の方を述べさせていただきたいと思います。 みなさまありがとうございました! 私の疑問に思っていた問題はこれらの回答により、解決・理解することができました。 また何かありましたら、次回もご教授の方をよろしくお願いいたします。
- tatsu99
- ベストアンサー率52% (391/751)
しばらくアセンブラは使用してないので、自信なしですが、 レジスタの操作をアセンブラは出来るが高級言語には、その概念がないか、又は、レジスタを直接操作することはできない。 例として、int a,b;で a=b;の命令は bのメモリをレジスタに転送 そのレジスタの内容をaに転送 の2段階となります。 又、高級言語では、サブルーチンの呼び出しで、必ず、サブルーチンは呼び出し元に戻ってきます。 これは、アセンブラで、プログラムカウンタと呼ばれるレジスタを操作し、呼び出しもとに戻る仕組みを実現しています。 又、C言語でいうところの動的メモリ(関数内のstatic宣言しないメモリ)は、スタック領域に確保されます。このスタック領域は、スタックレジスタにより管理されていますが、C言語ではその意識はしません。 等の例があります。
お礼
予想以上にみなさまが詳細な返答をしてくださり、とても感謝しております。 各人一人づつお礼の言葉を言わせていただきたいところではありますが、大勢のためうっとおしく感じられる方もいらっしゃると思いますので、もうしわけありませんがこちらの方で、みなさんにお礼の方を述べさせていただきたいと思います。 みなさまありがとうございました! 私の疑問に思っていた問題はこれらの回答により、解決・理解することができました。 また何かありましたら、次回もご教授の方をよろしくお願いいたします。
- raphel_7
- ベストアンサー率34% (86/252)
なかなかいい例がなかったのですが、「ハードウェアに予め用意されている機能を利用してのプログラム製作が可能」ということで、ハードディスクの回転を止めなさいって命令はハードウェアに予め用意されていると思うんですが、C言語からこのような命令出せるんでしょうか? 多分出せないと思います。 しかし、アセンブラならできるはずです。 あと、通常使用できないメモリ空間でもアセンブラだったらアクセスできたりしますね。 回答になっていなかったらすいません。
お礼
予想以上にみなさまが詳細な返答をしてくださり、とても感謝しております。 各人一人づつお礼の言葉を言わせていただきたいところではありますが、大勢のためうっとおしく感じられる方もいらっしゃると思いますので、もうしわけありませんがこちらの方で、みなさんにお礼の方を述べさせていただきたいと思います。 みなさまありがとうございました! 私の疑問に思っていた問題はこれらの回答により、解決・理解することができました。 また何かありましたら、次回もご教授の方をよろしくお願いいたします。
- tepeto
- ベストアンサー率35% (25/71)
現在のCPUのアセンブラ言語は知りませんが8080/Z80の知識でお答えします。 高級言語には存在しないというよりも、アセンブラはより細かくハードウエアを直接さわる事が出来るという方が正解ではないでしょうか。例えばアセンブラは「Aレジスタを左に1ビットシフトする。」というニーモニックはありますが、BASIC言語には基本的には存在しないはずです。 今のCPUは判りませんがZ80の場合はD-RAMのリフレッシュレートもアセンブラでいじる事ができました。 こんなところでしょうか。
お礼
予想以上にみなさまが詳細な返答をしてくださり、とても感謝しております。 各人一人づつお礼の言葉を言わせていただきたいところではありますが、大勢のためうっとおしく感じられる方もいらっしゃると思いますので、もうしわけありませんがこちらの方で、みなさんにお礼の方を述べさせていただきたいと思います。 みなさまありがとうございました! 私の疑問に思っていた問題はこれらの回答により、解決・理解することができました。 また何かありましたら、次回もご教授の方をよろしくお願いいたします。
お礼
予想以上にみなさまが詳細な返答をしてくださり、とても感謝しております。 各人一人づつお礼の言葉を言わせていただきたいところではありますが、大勢のためうっとおしく感じられる方もいらっしゃると思いますので、もうしわけありませんがこちらの方で、みなさんにお礼の方を述べさせていただきたいと思います。 みなさまありがとうございました! 私の疑問に思っていた問題はこれらの回答により、解決・理解することができました。 また何かありましたら、次回もご教授の方をよろしくお願いいたします。