做字幕网站,沧州机械类网站建设,邮箱如何注册企业邮箱,手机网站开发位置定位mov指令
MOV X22, X0 将X0的值移到X22中
参数传递
参数1#xff1a;寄存器X0传递 参数2#xff1a;寄存器X1传递 参数3#xff1a;寄存器X2传递 参数4#xff1a;寄存器X3传递 #xff08;这里的X0传递的就是第一个实际参数#xff0c;而不是self、selector之类的寄存器X0传递 参数2寄存器X1传递 参数3寄存器X2传递 参数4寄存器X3传递 这里的X0传递的就是第一个实际参数而不是self、selector之类的
如果需要传递更多参数会使用栈来传递
返回值
ARM架构下通常使用X0来存储返回值
ADRP指令
ADRPAddress of PC-relative Data指令是ARM指令集中的一条指令用于将指定的绝对地址的高16位即地址的页索引左移12位乘4096页大小后存储到目标寄存器中
ADRP指令和LDR指令
ADRP指令通常与LDR指令结合使用
例如
ADRP X8, #classRef_CDVInvokedUrlCommandPAGE
LDR X0, [X8,#classRef_CDVInvokedUrlCommandPAGEOFF]这两行代码的作用是 将 CDVInvokedUrlCommand 类的引用地址classRef_CDVInvokedUrlCommand加载到 X0 寄存器 中
通常后续会将X0 作为一个参数最终传递给_objc_msgSend函数让_objc_msgSend的第一个参数就是X0的值这样后面就可以调用CDVInvokedUrlCommand这个类的某个函数
(1) ADRP X8, #classRef_CDVInvokedUrlCommandPAGE 将 classRef_CDVInvokedUrlCommand 类的引用地址的高16位存储到 X8 中
ADRP 用于将指定的绝对地址的高16位即地址的页索引左移12位乘以4096页大小后存储到目标寄存器中# 表示后面的操作数是一个立即数classRef_CDVInvokedUrlCommandPAGE 是一个标签表示类的引用地址的高16位 PAGE 表示取地址的高16位
(2) LDR X0, [X8,#classRef_CDVInvokedUrlCommandPAGEOFF] 从基址为X8偏移量为 classRef_CDVInvokedUrlCommand 的低16位的地址处加载一个值到 X0
LDR 从地址取值classRef_CDVInvokedUrlCommandPAGEOFF 是一个标表示类的引用地址的低16位 PAGEOFF 表示取地址的低16位
完整的使用例如
;00000001002FE1D8
ADRP X8, #classRef_CDVInvokedUrlCommandPAGE
LDR X0, [X8,#classRef_CDVInvokedUrlCommandPAGEOFF]
MOV X2, X21
BL sub_101FFCD40
MOV X20, X0其中此时X1是当前函数的Selector记作selector2 X2来自X21 是一个局部变量记作ScriptMessage_body2X20记作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_ptrPAGE
LDR X16, [X16,#_objc_msgSend_ptrPAGEOFF]
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);