を達成するために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の返事が正しいと確信しています。
FYI;呼び出されるメソッドの戻り値の型と引数の型を反映するために、 'objc_msgSend()'に呼び出しをキャストする必要があります。そうしないと、生成されたコードが正しくない可能性があります。 – bbum
@bbumこれはアセンブリの自動生成ビットではなく、むしろ手書きで書かれています(「cfa」ラベルの欠如、関数呼び出しの周りのスタック保存 - これは付随的にこのコードの問題です)、SIMD ARMv7のiOS呼び出し規則は、スタックに格納されるすべてのSIMDレジスタを必要とし、clangはその規則を壊すことはありません)。 –
@ RichardJ.RossIIIそれは私の問題ではありませんでした。 Cコードの最初のビットが間違っています。 ARMの実装パターンを決定するためにアセンブリを調べる目的でコンパイルされた場合、誤った結果が得られる可能性があります。 – bbum