坂井です.はじめまして.
読んでいただきありがとうございます.お役に立てたようならばなによりです.
<
a040c76e-4a76-430d...@googlegroups.com>の記事において
aosh...@gmail.comさんは書きました。
>> 1.スタートアップをアセンブラで書かなければならないのは、スタックポインタを
>> 初期化するためでしょうか?もし初期化しなくていいならCで書けるように思うのですが。
基本的な理由としてはそのとおりで,スタックポインタを初期化するためです.
スタックポインタが初期化されていない状態でC言語の関数が呼ばれると,
関数の先頭ではスタックにレジスタを退避するような処理が行われるため,
関数が呼ばれた瞬間に動作がおかしくなる,という原因になります.
それとは別に,書籍としての理由もあります.
書籍中で説明されていますが,以下の3箇所に関しては,アセンブラでないと
書けない部分になります.
・スタートアップ
・割込み処理の入口と出口
・タスクディスパッチ
これらは通常はアセンブラで書かれます.工夫次第ではC言語でも書けるかも
しれませんが,本書は入門書なので,サンプル・プログラムとしては
無理にC言語で書いたりせずに,素直にアセンブラで書く,というポリシーで
書籍を書いています.アセンブラで書かれるべき部分は無理に隠さずに
素直にアセンブラで書くべき,という考えです.
それとは別に参考までにの話ですが,Linuxアプリケーションにもスタートアップは
あります.ただしこちらはLinuxカーネルがスタックポインタを設定した状態で
プロセスを起動するため,スタートアップは最初からC言語で書かれています.
KOZOSの場合は,もしもブートローダーがスタックポインタを設定した状態で
KOZOSのスタートアップを呼ぶような構成になっていれば,KOZOS側での
スタックポインタの設定は必ずしも必要ではなく,やはりC言語でスタートアップを
書くことは可能です.が,先述したように入門書としての目的があるため,
そのようなことはせずにスタートアップはやはりアセンブラで書いています.
>> 2.割込みベクタに登録されたアドレスがアセンブラで書かれており、ROMに書かれているので、
>> 割込みが入るたびにアクセスが入りますよね?一般的にROMはRAMよりアクセスが遅いと書いて
>> あったので、割込みが入るたびに処理が遅くなるのかと気になります。
そのとおりですね.
ただ実際にはキャッシュされると思われるので,極端に遅くなるようなことは
無いかと思います.
ROM上のコードに速度的な問題がある場合には,よく呼ばれるコードは
キャッシュに固定でロードしておくなどが行われる場合があります.
(ただしKOZOSではそのようなことは行っていません)