使用ARM assambly实现objective-c方法

时间:2016-12-07 10:29:45

标签: objective-c objective-c-runtime

我想使用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的返回是正确的,所以我忽略了其他任何东西????

1 个答案:

答案 0 :(得分:1)

是的,我已经解决了这个问题。关键是objc_getClass方法会改变r1的值......但是这个方法只需要一个参数并返回Class对象。我会继续探索它