2010-12-02 14 views
2

C main関数からアセンブリ関数に引数を渡すにはどうすればよいですか?今、私は、アセンブリファイルにsomedataを使用する方法Cからアセンブリに引数を渡しますか?

void function(char *somedata) __attribute__((cdecl)); 

:私は私のカスタム関数のようなものを見て持っていることを知っています。私の操作システムはLinux Ubuntuで、私のプロセッサはx86です。

答えて

12

私はこれについて少し戸惑いがちですが、うまくいけば、この例はあなたのところにあなたを得るでしょう。私はそれを試して、それが動作する、あなたが持っているかもしれない唯一の問題は、ソフトウェアが利用できないことです。私はアセンブリのためにnasmを使用しています。

main.cの

extern void myFunc(char * somedata); 

void main(){ 
    myFunc("Hello World"); 
} 

myFunc.asm

section .text 
    global myFunc 
    extern printf 

    myFunc: 
     push ebp 
     mov ebp, esp 

     push dword [ebp+8] 
     call printf 

     mov esp, ebp 
     pop ebp 
     ret 

COMPILE

nasm -f elf myFunc.asm 
gcc main.c myFunc.o -o main 

注:あなたはNASM(アセンブラ)をインストールする必要があり

(それをUbuntuのです:sudo apt-get install nasm)

基本的にCコードで何が起こるのかは、メッセージでmyFuncを呼び出します。 myFunc.asmでは、文字列の最初の文字のアドレスを取得します(これは[ebp + 8]にあります)。ここに情報があります(http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html)。 printfはCの標準ライブラリにあり、gccはデフォルトで自動的に私たちのコードにリンクします。 to。

アセンブリファイルでmyFuncをエクスポートし、main.cファイルのextrnal関数としてmyFuncを宣言しなければなりません。myFunc.asmでは、stdlibからprintf関数をインポートします。できるだけ簡単に

これは多少役立ちます。

+0

まさに私が探しているもの。 –

+2

@jwwishartあなたは今1337の評判を得ました。もし誰かがあなたに投票したら、それは恥ずかしいでしょうか? ^^ – displayname