赞
踩
MOV X22, X0
将X0的值移到X22中
参数1:寄存器X0传递
参数2:寄存器X1传递
参数3:寄存器X2传递
参数4:寄存器X3传递
(这里的X0传递的就是第一个实际参数,而不是self、selector之类的)
如果需要传递更多参数,会使用栈来传递
ARM架构下,通常使用X0来存储返回值
ADRP(Address of PC-relative Data)指令是ARM指令集中的一条指令,用于将指定的绝对地址的高16位(即地址的页索引)左移12位(乘4096,页大小)后存储到目标寄存器中
ADRP指令通常与LDR指令结合使用
例如
ADRP X8, #classRef_CDVInvokedUrlCommand@PAGE
LDR X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF]
这两行代码的作用是 将 CDVInvokedUrlCommand
类的引用地址classRef_CDVInvokedUrlCommand
加载到 X0
寄存器 中
通常,后续会将X0 作为一个参数,最终传递给_objc_msgSend函数,让_objc_msgSend的第一个参数就是X0的值,这样后面就可以调用CDVInvokedUrlCommand
这个类的某个函数
(1) ADRP X8, #classRef_CDVInvokedUrlCommand@PAGE
将 classRef_CDVInvokedUrlCommand 类的引用地址的高16位存储到 X8 中
(2) LDR X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF]
从基址为X8,偏移量为 classRef_CDVInvokedUrlCommand 的低16位的地址处,加载一个值到 X0
;00000001002FE1D8
ADRP X8, #classRef_CDVInvokedUrlCommand@PAGE
LDR X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF]
MOV X2, X21
BL sub_101FFCD40
MOV X20, X0
其中,此时X1是当前函数的Selector(记作selector2
), X2来自X21 是一个局部变量(记作ScriptMessage_body2
),X20记作v16
那么这里就相当于
v16 = sub_101FFCD40(&OBJC_CLASS___CDVInvokedUrlCommand, selector2, ScriptMessage_body2);
我们G到101FFCD40处看看sub_101FFCD40是什么
;0000000101FFCD40
ADRP X1, #selRef_commandFromJson_@PAGE
LDR X1, [X1,#selRef_commandFromJson_@PAGEOFF]
ADRP X16, #_objc_msgSend_ptr@PAGE
LDR X16, [X16,#_objc_msgSend_ptr@PAGEOFF]
BR X16
同上,不再赘述,这里相当于
return _objc_msgSend(&OBJC_CLASS___CDVInvokedUrlCommand, "commandFromJson:", ScriptMessage_body2);
(貌似传给sub_101FFCD40的参数2 selector2
直接被弃用了,没用上,我猜是编译器优化时发现没必要动X1,所以就直接传下来了)
类似于
return [CDVInvokedUrlCommand commandFromJson:ScriptMessage_body2];
也就是
return CDVInvokedUrlCommand.commandFromJson(ScriptMessage_body2);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。