我想使用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 :(得分:1)
是的,我已经解决了这个问题。关键是objc_getClass方法会改变r1的值......但是这个方法只需要一个参数并返回Class对象。我会继续探索它