• 締切済み

メモリ上にプログラムをロードして実行したい!!

hanabutakoの回答

回答No.1

マイコンってRAMにあるプログラムを実行出来ましたか? プログラム領域とRAM領域が明確に分かれているとしても、プログラム領域の空いているところにプログラムを書きこんで、そこを呼び出すことで動きそうな予感はします。 (実行中のプログラムからプログラム領域への書き込みができるか知りませんが) マイコンでやったことはありませんが、その手のことをC言語でやるには、プログラムのロードは単なるメモリーのコピーなのでストレージから普通にメモリーにデータを読みだして、そのアドレスにジャンプするという流れになると思います。ジャンプの方法は呼び出される側で準備をした上で、関数ポインターに飛ばしたい先のアドレスを代入して呼び出しても良いですし、そこだけインラインアセンブラにしても良いかもしれません。 プログラム領域にあるプログラムしか実行できないなら、予めプログラム領域に無駄に配列などを確保して、そこにプログラムを書きこんでジャンプという流れになるでしょうか。 技術的にできそうなことはわかりますが、やったことは無いので、あとは頑張って。

deltatled
質問者

お礼

おぉ、回答ありがとうございます!! >マイコンってRAMにあるプログラムを実行出来ましたか? いわれてみればAVRはハーバードですから、データとプログラムとが別になってたら難しいですね。 SH2Aなら結構本格的な感じですし、メモリの領域がフラットっぽいのでAVRよりは出来そうな感じです。 >ジャンプの方法は呼び出される側で準備をした上で、関数ポインターに飛ばしたい先のアドレスを代入して呼び出しても良いですし、そこだけインラインアセンブラにしても良いかもしれません。 別のプログラムのエントリーポイントのアドレスってどうやって取得するのでしょうか? ファイルの先頭=エントリーポイントと考えてよいのでしょうか? >プログラム領域にあるプログラムしか実行できないなら、予めプログラム領域に無駄に配列などを確保して、そこにプログラムを書きこんでジャンプという流れになるでしょうか。 確かにできそうです!! しかし配列内のどこにジャンプさせたらよいのでしょう? 上にも書いたみたいにファイルの先頭ですと配列の先頭のアドレスにジャンプしたらいいのでしょうか? 配列のアドレスを関数ポインターに代入して呼び出しみたいな感じですか。 書き込んでいて思いつきましたが、gotoとかも指定したアドレスにジャンプとか言う用途に使えるのでしょうか?(goto使ったこと無いのでよく解りません)

関連するQ&A

  • 実行可能プログラムにするには

    猫にも分かるプログラミングにプログラムがありますが、そのプログラムをそのままコピーしてロード(?)したら動かせるようになるのでしょうか? 今、C言語のソフトがアンインストールした状態で入っていませんが、ロードの仕方はどのようにすればいいのでしょうか? 石取りゲーム http://www.kumei.ne.jp/c_lang/intro/no_74.htm

  • AIX、実行プログラム解析

    AIX上でC言語で開発をしています。 できあがった実行プログラムの解析ツールはないでしょうか? 逆アセンブラみたいに詳細でなくて良く、メインから呼出して いる関数の一覧とか、この関数がどこから呼ばれているか、 などの相関図的なものを探しています。 宜しくお願いいたします。

  • H8マイコン開発

    H8/3069Fマイコンボードを買ってきて勉強をしようと思うのですが、 どこから手を付けていいのかわからないです・・・・。 C言語/アセンブラでプログラムを書いて何か実行させてみたいのですが、何かいい参考になるのはないでしょうか?

  • PCに挿したIOボードを制御するためのプログラム

    IOボード(AD/DAボード)を使ってPCで入出力制御(例えばモーターのフィードバック制御)をしたいと思っているのですが、ボードにアクセスするためのプログラムや、信号を入出力するためのプログラムをどのように書いたら良いかわかりません。おそらくデータシート?に書いていると思うのですが、知識不足で読み解くことができません。(いままでArduino IDEでArduinoの制御をしたことしかありません。普通にC言語でAVRマイコンをプログラムして制御することはできません。C言語の基礎知識はあります。) そこで質問なのですが、PCから(例えばPCIスロットに挿した)IOボード(AD/DAボード)を制御するための知識は、どのようにして習得できますでしょうか?参考になる本やサイトが見つかりません。PICやAVRなどのマイコンであれば本が色々出ているようなのですが、そのようなマイコンを使えるようになれば、PCからIOボードを制御できる基礎知識は付きますでしょうか?

  • アセンブラを実行したいのですが

    パソコン初心者です。 Windows XPにアセンブラ「NASM」をダウンロードしました。 コマンドプロンプトで簡単なプログラムを実行しようと思います。 以下がプログラムです。 ; dispchar.asm mov ah,02 mov dl,31h int 21h mov ah,4ch mov al,0 int 21h コマンドプロンプトに「; dispchar.asm」と入力すると、内部コマンド、外部コマンドまたは操作可能なファイル、バッチファイルとして認識されていません」と出ます。 同様に、「mov ah,02」から入力しても同様のコメントが返ってきます。 プログラムを実行するにはどうすればよいでしょうか?

  • プログラムはどのように動いているのか

    プログラムはどうやって動いているのかを構造的に教えて下さい。 「プログラムは、メモリーにロードされ、CPUによって解釈・実行されます」とありますが コンピュータの内部ではプログラムの正体はどんな物で メモリとCPUはどんな構造をしていて どうやってメモリに読み込んで、CPUはどうやってプログラムを解釈、実行しているのかを構造的に教えて下さい。

  • PICに書き込むプログラムや変数の容量を少なくする方法

    16f877のpicマイコンでプログラミング作業を行っています もともとPC上でのソフト開発がメインだったので マイコンプログラムはいろいろ制約があり大変です 現在C言語によってプログラムを書いているんですが ccscでコンパイルすると容量不足でエラーがでます not enough ram for valiaホニャララ 等がよく出ます。 マニュアルを読むと変数を減らせとかいろいろ書いてありますが 減らしても改善できません。 知人に聞くとアセンブラで書くといいよと言われましたが アセンブラはわからないのでCじゃないとだめです なにか容量をあまり取らないコーディングやその他のテクニックをご存知の方 教えてください、お願いします。 また、参考になる書籍やURL等がありましたら教えてください

  • あるプログラム実行中に別のプログラムを起動したい

    とあるC言語で出来たa.outというプログラム実行中に、b.outというプログラムを実行するプログラム「c.c」を作成したいのですが、どのようにプログラミングすればよいでしょうか? a.outは無限ループするような十分に実行時間の長いプログラムです。 ちなみに、c.cはシェルスクリプト「c.sh」でも構いません。

  • 組込みプログラム言語の容量・速さの比較

    組込みプログラム言語の容量・速さの比較 組込みプログラムで使用する言語には ・C(++) ・アセンブリ言語 ・JAVA ・(組込み用JAVAのJ2ME) ・(組込み用JAVAのKVM) がありますが、ターゲットデバイス(マイコンなど)へロードする ロードモジュールの状態でのサイズ(容量)は同じなのでしょうか。 違うのであればどれくらいの差があるのでしょうか。 私の予想では  アセンブリ言語 < C(++) < JAVA ですが、どれくらいの差があるのか想像がつきません。 また処理の速さは  アセンブリ言語 > C(++) > JAVA になるのでしょうか。

  • プログラムの実行時間の計測について

    プログラムの実行時間を計測したいのですが、 どのようにすればよいですか? 使っている言語はC++です。