iOS 汇编教程

基础简介

  • iOS 设别的 CPU 使用 ARM 架构设计,ARM 芯片的指令集选用 RISC
  • mov r0, #42

    • 目标是第一个 ,即:把42移动到寄存器 r0中
  • ldr r2, [r0]

    • 把 r0中的值装载在寄存器 r2中
  • add r4, r2, r3

    • 把寄存器 r2, r3中的值进行 add 操作,加的结果放到寄存器 r4中
  • str r0, [sp, #8]

    • 把寄存器 r0中的内容存储到栈指针(sp)+8的位置
    • ldr相反 – ldr 把内存中的内容存储到寄存器中
  • add r0, r1

    • r0r1中的内容相加储存到r0
    • 如果 add 指令只有两个参数,那么就把第一个参数当做目标寄存器

函数调用约定

  • ARM 的 CPU 有16个寄存器:r0 到 r15,每隔寄存器为32bit

    • r0 – r3:存储传递给函数的参数值
    • r4 – r11:存储函数的局部变量
    • r12;内部过程调用暂时寄存器
    • r13:存储栈指针(sp) – 保存栈顶指针
    • r14;链接寄存器(link register)- 存储着当被调用函数返回时,将要执行的吓一条指令的地址
    • r15:程序计数器(program counter),存储着当前执行指令的地址,每条程序被执行后,该计数器自增
  • 在汇编代码中,以”.”开头的都不是汇编指令,阅读时可以忽略

  • 代码中以冒号结尾的代码行(例如 _addFunctionLtim0:),称之为『label』。这些标签的作用是给汇编代码段指定相关的名字,实际上是一个函数的入口
  • 这个标签(_addFunction)是必须有的,别的代码调用 addFunction函数时,并不需要知道该函数具体在什么地方,通过简单的一个符号或者标签就可以进行调用。在最终生成的程序二进制文件时,链接器(link register)会把这个标签转换为实际的地址
    • 编译器总是会在函数名前面加一个下划线_,这是一个约定
  • 其他所有的标签都是以L开头,这些通常称为局部标签(local label),只会在函数内部使用
  • 注释是以@字符开头