アセンブラからCの関数を呼び出す方法は?

このQ&Aのポイント
  • 「OS自作入門」を読んで試しています。フロッピーのブートセクタに自作のブートプログラムを書き込み、ブートプログラムから自作のOSを呼び出して実行しています。アセンブラでのプログラム作成はきついので、C言語で書きたいと思っています。具体的には、自作のOSからCで書いた関数を呼び出して実行したいです。どのようにすればいいでしょうか?
  • 質問者は「OS自作入門」を読みながら、自作のブートプログラムからOSを呼び出して実行しています。しかし、プログラム作成にアセンブラを使うのは難しいため、C言語で書きたいと思っています。具体的には、自作のOSからCで書いた関数を呼び出したいです。どのような方法で実現できるでしょうか?
  • 「OS自作入門」を読んでいる質問者は、自作のブートプログラムを使ってOSを呼び出して実行しています。しかし、アセンブラでプログラムを書くことは難しいため、C言語を使いたいと考えています。具体的には、自作のOSからCで書いた関数を呼び出して実行したいです。どのような方法を取ればよいでしょうか?
回答を見る
  • ベストアンサー

アセンブラからCの関数を呼び出すには?

「OS自作入門」を読んで試しています。 フロッピーのブートセクタに自作のブートプログラムを 書き込み、ブートプログラムから自作のOSを呼び出して実行 しています。自作といっても前述の参考書の物まねですが・・・・。 ここまでは全てアセンブラでプログラムを書いてきました。 NASMを使っています。ずっとアセンブラではきついので C言語で書きたいのです。 まずは自作のOSからCで書いた関数を呼び出して実行したいの です。つまり・・・ OS.ASM + TEST.C→OS.BIN としたいのです。OS.ASMは自作のOSです。TEST.CにはCの関数を 書いておき、OS.ASMから呼び出すようにします。 これらをくっつけてOS.BINというファイルにしたいのです。 どうすればいいでしょうか?  (1) ブートプログラムの中で16ビットモードから32ビットモードに 切り替えており、自分でセグメントを決めてあります。TEST.Cも それにあわせる必要があるかと思いますが、どうすれば? (2) OS.ASMとTEST.Cをどうやってくっつけるのかがわからない。 リンカーとか使うのでしょうか?

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

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

Cコンパイラ(の出すオブジェクト)の都合に合わせて,os.asm側を合わせる必要があるでしょう. Cでの関数名とアセンブラでの名前は違います.前にアンダーラインがつくのがUNIX系では定番ですが,ご使用のコンパイラでどうなるか調べる必要があります. あと,引数の受け渡しも,Cの呼び出しシーケンスを調べてそれに合わせる必要があります. (2)は,リンカーを使います. どっちかといえば, ・最低限のスタートアップルーチンだけをかいて速やかにCで書いたコードに制御を移す. ・必要な部分はアセンブラで書いて,Cからアセンブラコードを呼び出す というスタイルの方が楽だと思いますよ.

関連するQ&A

  • アセンブラ

    nasmは持っているのですが、nasmでコンパイルしたプログラムはcmd.exeから実行してもできません(結果がうまく表示されません)。 わざわざCOMMAND.comから実行しなくてはいけないのですがとても面倒です。。。 そこでcmd.exeで実行できるプログラム(exeファイル)を作れるアセンブラを探しています。 知っている人がいたら教えてください。 それから、よくわからないのですが axレジスタじゃなくてeaxレジスタを使うプログラムってなんていうんですか??

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

    パソコン初心者です。 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」から入力しても同様のコメントが返ってきます。 プログラムを実行するにはどうすればよいでしょうか?

  • アセンブラが実行しません

    パソコン初心者です。 これからアセンブリ言語を学ぼうと思っています。 アセンブラとしてNASMをDドライブにダウンロードしました。 環境変数の設定でPATHにNASMをダウンロードしたディレクトリを追加しました。 試しに、アセンブリの簡単なプログラムを実行しようとしましたが、 「内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません」と表示されます。 これはどういうことでしょうか? どうすれば、アセンブラが実行できるのか教えてください。 お願いします。

  • NASMについての質問です。

    NASMについての質問です。 mov ah, 02h mov dl, 31h int 21h という内容のASMファイルをつくり、それをNASMで実行ファイルにし、実行しようとしたのですが、うまくいきません。 コマンドプロンプトで、 nasm.exe -f bin test.asm -o myfile.com というコマンドを打って実行ファイルにしました。きちんとmyfile.comは作られるのですが、しかし、myfile.comを実行しても何も表示されませんでした。(なぜかコマンドプロンプトの文字のフォントが変わりましたが) それならと思い、今度は、 nasm.exe -f bin test.asm -o myfile.exe というコマンドを打ち、実行してみました。ちゃんとmyfile.exeは作成されるのですが、やはりうまく実行できません。上のソースコードなら、文字が一文字表示されるはずですが、なにも表示されませんでした(前回と同じくコマンドプロンプトのフォントが変わっただけです)。 当方、一応コンピュータ系の専門学校に通っているのですが、アセンブラのことについては完全な初心者です。NASMをさわるのも初めてです。わけがわからなくて困っています。 どうにかしてアセンブリ言語のコードを実行ファイルにして、それを動かしてみたいのですが、どうすればいいでしょうか? 追伸 長文すいません。

  • アセンブラでのメモリの動的確保について

    自作コンパイラのために最近NASMを使ってアセンブラの勉強を始めたものです。 メモリ領域の確保のためにNASMでは buffer: resb 64 と宣言しますが、C++でのchar* buffer=new char[size]; のような、動的なメモリ領域の確保の記述は可能でしょうか? 普段はC++を主に使っているため、見当違いな質問かもしれませんが、よろしくお願いします。

  • masm32がうまく動きません。

    アセンブリ言語を学ぼうとmasm32をインストールしました。 インストール手順は下記のように行いました。 ・masm32を C:\ にインストール ・masm32のbinフォルダの中にあるlink.exeをlink32.exeに名前を変更し、16bitリンカLINk.exeをbinフォルダに投入 ・システム環境変数に SET PATH=C:\MASM32\BIN;%PATH% SET INCLUDE=C:\MASM32\INCLUDE;%INCLUDE% SET LIB=C:\MASM32\LIB;%LIB% を書き加える。 ソースをC:\に保存し、アセンブラしてみると C:\>ml /c /Fl test.asm 'ml'は内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。 と出ます。 ソースの保存場所をC:\masm32\binに変えて C:\masm32\bin>ml /c /Fl test.asm の形でアセンブラすることはできます。 ソースをC:\に保存した状態でアセンブラできない原因は何が 考えられるでしょうか?

  • インラインアセンブラの関数について質問です。

    C言語で書かれたプログラムの中に、アセンブラで書かれた関数を使うため、インラインアセンブラで関数を作っていたのですが、私の能力の限界を感じたので、是非、ご教授願います。以下に示します。 元のアセンブラの関数write_mem82(int addr, int data) MOV EAX, [ESP+4] MOV AL, [ESP+8] MOV [EAX], AL RET です。これは、OS○作○門という本に載っていたものですが、プログラムをインラインアセンブラにすると、成功するのかふと疑問に思ったのです。よって、アセンブラの種類は、nasmを基にしたnaskです。 こういうことは、その本のサポートページか何かで質問すればよい的なことをおっしゃる方もおられると思います。残念ながら、サポートページは、ほぼ凍結状態で、何年待てば回答が返ってくるのか?という状態です。 そういう経歴で、ここの質問させていただくに至りました。 肝心の、私が書いてコンパイルエラーになるプログラムを書きます。 static __inline__ void write_mem82(int addr, int data){ __asm__ ( "MOV EAX,[ESP+4]": "MOV AL,[ESP+8]" "MOV [EAX],AL" "RET" ); } です。"MOV [EAX],AL"でエラーが出ます内容は構文が間違っているという内容のものです。なお、関数の名前は、意図的に変えてあります。オリジナルとは違います。 大した関数ではないのかもしれないのですが、わからないのでよろしくおねがいいたします。

  • アドレスを指定して関数を呼び出す方法は有りますか

     マイコンのROMに書いてある関数を呼び出すのに、次のような方法を使っています。  1000番地のsub1と言う関数を呼ぶのにアセンブラで次のように書き、リンカで結合しています。 sub1: EQU 1000  これをアセンブラを介せずC言語だけで行う方法は無いでしょうか。 イメージ的には次のような感じで1000番地のプログラムを呼びたいのです。  この方法では上手く行かないのは分かっていますが、それを何とかしたいと思っています。 #define sub1 1000 sub1() ;  宜しくお願いします。

  • NASMの使い方について。

    OSはXPです、メモ帳で作成したプログラムファイルをコマンドプロンプトでnasm -f bin myfile.asm -o myfile.comとコマンドしてもアセンブルされないんです、エラー等は何もでませんのでnasmは起動してると思うのですが、アセンブルされたファイルは元のファイルに上書きされるのでしょうか?または別のディレクトリに出来るのでしょうか? NASMに詳しい方いましたら1からの手順等教えて頂けませんか? 宜しくお願いします。

  • アセンブラでmain関数から作成すると

    アセンブラでmain関数から作成すると 以下gasです。 main: pushl %ebp と%ebpを最初にpushしますが、このebpの値はos側がこの実行ファイルをロードするときにセットするという感じでしょうか?

専門家に質問してみよう