美文网首页OC运行时
iOS-常见的汇编指令

iOS-常见的汇编指令

作者: 泽泽伐木类 | 来源:发表于2020-09-22 18:46 被阅读0次

前言

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

指令

  • mov:将某一个寄存器的值复制到另一个寄存器(只能在寄存器与寄存器或者寄存器与常量之间传值,不能用于内存地址)
mov x1, x0   // 将寄存器x0的值 复制到寄存器 x1
  • add:将某一寄存器的值和另一寄存器的值 相加(+) 并将结果保存在另一寄存器中
add x0, x1, x2   // 将寄存器x1 和 x2 相加后保存结果到寄存器x0中
  • sub:将某一寄存器的值和另一寄存器的值 相减(-) 并将结果保存在另一寄存器中
sub x0, x1, x2  //将寄存器 x1 和 x2 的值相减后 并将结果保存到 x0
  • and: 将某一寄存器的值和另一寄存器的值 按位与(&) 并将结果保存到另一寄存器中
and x0, x0, #0x1  // x0 & 0x1 ,将寄存器x0 的值和常量 1 按位与 后保存到寄存器x0
  • orr : 将某一寄存器的值和另一寄存器的值 按位或(|) 并将结果保存到另一寄存器中
orr x0, x0, #0x1   //将寄存器x0的值 与 常量 1 按位或 并将结果保存到x0
  • str :将寄存器中的值写入到内存中
str x0, [x0,x8]     //将寄存器x0 中的值 保存到栈内存 [x0+x8] 处
  • ldr : 将内存中的值读取到寄存器中
ldr x0, [x1,x2]  //将寄存器x1 和 x2 的值相加作为地址,取该内存地址的值放入x0中
  • cbz : 和 0 比较,如果结果为零就转移(只能跳到后面的指令)
cbz r1, LNilReceiver_f  //如果r1 = 0,就跳转到LNilReceiver_f
  • cbnz:和非 0 比较,如果结果非零就转移(只能跳到后面的指令)
  • cmp: 比较指令
cmp r12, #1
  • b :(branch)跳转到某地址(无返回)
b   __objc_msgSend_uncached
  • bl:跳转到某地址(有返回)
  • ret:子程序(函数调用)返回指令,返回地址已默认保存在寄存器 lr (x30)

其他

  • ENTRY:在ARM汇编中,ENTRY是一个伪指令,用于指du定汇编程序的入口点。在一个较大型的完整的汇编版程序(多个源权文件组成的工程)中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在某一个源文件里最多只能有一个ENTRY(可以没有)。
ENTRY _objc_msgSend
  • macro:.macro指令你可以定义一个宏,可以把需要重复执行的一段代码,或者是一组指令缩写成一个宏,在 程序调用的时候就可以直接去调用这个宏而使代码更加简洁清晰,此宏由以下3部分构成:
  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♪(・ω・)ノ

相关文章

  • iOS-常见的汇编指令

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

  • 常见汇编指令

    随时更新 leave: leave是汇编语言中的一条指令名 在32位汇编下相当于mov esp,ebppop eb...

  • 《汇编》 常见指令

    因为最近都是用cmd markdown进行写文章了,但是文章链接还是会挂在这里。汇编常见指令

  • 常见汇编指令

    指令基本格式操作码 操作数1 (操作数2 ……)对于双操作数指令,一般来说第一个是目标操作数 简单指令...

  • 常见的汇编指令

  • lab1 二进制炸弹

    汇编与反汇编 汇编与反汇编的区别 phase_1 比较字符串是否相同 二进制炸弹 常见汇编指令详解 AT&T 格式...

  • Swift 汇编常见指令

    mov: 将某一寄存器的值复制到另一寄存器(只能用于寄存器与寄存器或者寄存器与常量之间传值,不能用于内存地址)...

  • 逆向笔记(三)-汇编指令

    汇编指令 针对汇编来说,汇编指令是必须了解的,而且汇编中汇编指令比较多,但是每一个汇编指令对应的机器码是固定不变的...

  • 16位汇编简记

    汇编: 汇编即是机器指令助记符,机器指令让cpu工作。像是mov、jmp、jcxz等汇编指令都有对应的机器指令。有...

  • 逆向学习 持续更新中

    什么是汇编 机器指令能被计算机直接识别 汇编指令需要通过编译器转为机器指令 汇编指令和机器指令的差别在于指令的表示...

网友评论

    本文标题:iOS-常见的汇编指令

    本文链接:https://www.haomeiwen.com/subject/fxxgyktx.html