2016-12-07 5 views
1

を達成するためにassambly ARMを使用したとき、私はこのように、Objective-Cのメソッドを達成するためにARMアセンブリを使用したい:セレクタエラーObjective-Cのメソッド

NSLog(@"%@",objc_msgSend((id)objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),"abcdefg")); 

ので、私は、このようなアセンブリプログラムを書いた:

.data 
    .align 4 
    output_str: 
     .string "The answer is right" 
    nsstring: 
     .string  "NSString" 
    stringWithUTF8String: 
     .string  "stringWithUTF8String:" 
    .text 
    .align 4 
    .globl _my_arm_test 
    .globl _my_thumb_test 
    .globl _my_arm_test2 
    .extern _printf 
    .extern _objc_getClass 
    .extern _objc_msgSend 
    .extern _NSLog 
    .extern _sel_getUid 
    .extern _sel_registerName 
    .arm 
    .align 4 
    _my_arm_test2: 
     push {r0,lr} 
     sub sp, #0x28 
     ldr r0,=stringWithUTF8String 
     bl _sel_registerName 
     cmp r0,0 
     beq out 
     str r0, [sp] 
     ldr r1, [sp] 
     ldr r0, =nsstring 
     bl _objc_getClass 
     ldr r2,=output_str 
     bl _objc_msgSend 
     bl _NSLog 
    out: 
     add sp, #0x28 
     pop {r0,pc} 

プログラムを実行することができますが、私は、セレクタに何か問題があったことを示した次のエラーを見つけた:

*** NSForwarding: warning: selector (0x3a43b0b0) for message '' does not match selector known to Objective C runtime (0x200be0)-- abort 

そして、私は_sel_registerNameの返事が正しいと確信しています。

+0

FYI;呼び出されるメソッドの戻り値の型と引数の型を反映するために、 'objc_msgSend()'に呼び出しをキャストする必要があります。そうしないと、生成されたコードが正しくない可能性があります。 – bbum

+0

@bbumこれはアセンブリの自動生成ビットではなく、むしろ手書きで書かれています(「cfa」ラベルの欠如、関数呼び出しの周りのスタック保存 - これは付随的にこのコードの問題です)、SIMD ARMv7のiOS呼び出し規則は、スタックに格納されるすべてのSIMDレジスタを必要とし、clangはその規則を壊すことはありません)。 –

+0

@ RichardJ.RossIIIそれは私の問題ではありませんでした。 Cコードの最初のビットが間違っています。 ARMの実装パターンを決定するためにアセンブリを調べる目的でコンパイルされた場合、誤った結果が得られる可能性があります。 – bbum

答えて

1

はい、私はこの問題を解決しました。重要なポイントは、objc_getClassメソッドはr1の値を変更します......しかし、このメソッドは1つのパラメータを必要とし、Classオブジェクトを返します。それ。

+0

ARMの呼び出し規則により、レジスタr0〜r3が受信側でクローラ可能になります。 r4-r7は保証されています。スタックを使用して、関数呼び出しの間に値を保持します。 –

+1

iOS向けARMについてお知りになりたい場合は、次の資料をご覧ください。 [iOS ABIガイド](https://developer.apple.com/library/content/documentation/Xcode /Conceptual/iPhoneOSABIReference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009020-SW1)、[ARM ABI Guide](http://infocenter.arm.com/help/index.jsp?topic=/com .arm.doc.subset.swdev.abi/index.html)、[ARMアセンブラリファレンス](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/index .html)、[iOS App in ASM](https://github.com/richardjrossiii/iOSAppInAssembly)(参考:私) –

+0

@リチャードJ.ロスIIIあなたの提案に感謝します~~実際には、私はまだr1が変更される必要があることを理解していません。ご覧のとおり、objc_getClassはr0が渡されたことを意味する1つのパラメータを必要とし、どのような方法でr0.no問題で私はr1が変更される理由を見つけることができない..........私はあなたが提案するリンクを読むでしょう。 – CSJ

関連する問題