OC运行时

iOS-常见的汇编指令

2020-09-22  本文已影响0人  泽泽伐木类

前言

在我们iOS底层探索的时候,经常需要阅读一些汇编源码,第一次看到的时候总是一头雾水,本片文章就介绍一些常见的汇编指令。

指令

mov x1, x0   // 将寄存器x0的值 复制到寄存器 x1
add x0, x1, x2   // 将寄存器x1 和 x2 相加后保存结果到寄存器x0中
sub x0, x1, x2  //将寄存器 x1 和 x2 的值相减后 并将结果保存到 x0
and x0, x0, #0x1  // x0 & 0x1 ,将寄存器x0 的值和常量 1 按位与 后保存到寄存器x0
orr x0, x0, #0x1   //将寄存器x0的值 与 常量 1 按位或 并将结果保存到x0
str x0, [x0,x8]     //将寄存器x0 中的值 保存到栈内存 [x0+x8] 处
ldr x0, [x1,x2]  //将寄存器x1 和 x2 的值相加作为地址,取该内存地址的值放入x0中
cbz r1, LNilReceiver_f  //如果r1 = 0,就跳转到LNilReceiver_f
cmp r12, #1
b   __objc_msgSend_uncached

其他

ENTRY _objc_msgSend
  1. 头: 在这里可以指定这个宏的名称,并且定义形式参数
  2. 体: 这里包含的是当这个宏被调用时所需要执行的指令或者语句。
  3. 尾: 这里用.endmacro标识着这个宏的结束。
.macro MethodTableLookup        //头部
    
    stmfd   sp!, {r0-r3,r7,lr}
    add r7, sp, #16
    sub sp, #8          // align stack
    FP_SAVE

    // lookUpImpOrForward(obj, sel, cls, LOOKUP_INITIALIZE | LOOKUP_RESOLVER)
.if $0 == NORMAL
    // receiver already in r0
    // selector already in r1
.else
    mov     r0, r1          // receiver
    mov     r1, r2          // selector
.endif
    mov r2, r9          // class to search
    mov r3, #3          // LOOKUP_INITIALIZE | LOOKUP_INITIALIZE
    blx _lookUpImpOrForward
    mov r12, r0         // r12 = IMP
    
.if $0 == NORMAL
    cmp r12, r12        // set eq for nonstret forwarding
.else
    tst r12, r12        // set ne for stret forwarding
.endif

    FP_RESTORE
    add sp, #8          // align stack
    ldmfd   sp!, {r0-r3,r7,lr}

.endmacro            //尾部

总结

内容正在完善中,仅供参考,如有错误,请在评论区指正Thanks♪(・ω・)ノ

上一篇下一篇

猜你喜欢

热点阅读