3

Cのメイン関数からアセンブリ関数に引数を渡すにはどうすればよいですか?カスタム関数は次のようになっている必要があります。

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

somedataでは、アセンブリファイルでどのように使用しますか。私のオペレーティングシステムはLinuxUbuntuで、プロセッサはx86です。

4

1 に答える 1

13

私はこれについては少し初心者ですが、うまくいけば、この例があなたをあなたの道に連れて行くでしょう。私はそれをテストしました、そしてそれは働きます、あなたが持っているかもしれない唯一の問題はソフトウェアが利用できないことです。アセンブリに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

コンパイル

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 c呼び出し規約について説明している9.1.2を参照してください。)そして、それをprintf関数に渡します(スタックにプッシュします)。printfはc標準ライブラリにあり、gccはデフォルトでコードに自動的にリンクします。に。

アセンブリファイルでmyFuncをエクスポートし、main.cファイルでmyFuncを外部関数として宣言する必要があります。myFunc.asmでは、stdlibからprintf関数もインポートして、メッセージをできるだけ簡単に出力できるようにしています。

これがいくらか役立つことを願っています。

于 2010-12-02T01:05:54.023 に答える