1

iOS arm64 アセンブリ .s ファイルから malloc を呼び出そうとしていますが、*.m ファイルから _test_malloc を呼び出すと、_test_malloc() から返されません (これを iPhone5s で実行しています)。

私は何を誤解していますか?

//test_malloc.s
.private_extern _test_malloc
.globl  _test_malloc
.align  2
_test_malloc:
    mov  x0,  #8    
    bl   _malloc    //wordPtr = malloc(8)
    ret



//run_test_malloc.m
    extern uint32_t* test_malloc();
    static void run_test_malloc() {
        uint32_t* ptr = test_malloc();   
    }
4

2 に答える 2

3

呼び出し元のリンク レジスタの内容を保存していません。これを関数プロローグ命令に保存し、関数エピローグで復元する必要があります。スタックに何かを保存しているので、ABI の要求に応じてスタック ポインターが 16 バイト アラインされたままになるように、スタック ポインターを調整する必要もあります。フレーム ポインタ レジスタを設定し、すべての関数の後に復元する必要があります。

このセットアップと破棄がどのように行われるかを確認するために、コンパイラによって生成された関数を逆アセンブルすることをお勧めします。これは、ほぼすべての関数で同じように行われる単純なテンプレート コードです。

于 2014-02-13T05:09:01.740 に答える
1

これが私がそれを修正した方法です:

.private_extern _test_malloc
.globl          _test_malloc
.align          2
_test_malloc:
    //function prolog
    stp fp, lr, [sp, #-16]!
    mov fp, sp

    orr x0, xzr, #0x8
    bl _malloc         //malloc(8)

    //function epilog
    ldp fp, lr, [sp], #16
    ret lr
于 2014-02-14T14:38:56.917 に答える