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
- 把
r0
与r1
中的内容相加储存到r0
中 - 如果 add 指令只有两个参数,那么就把第一个参数当做目标寄存器
- 把
函数调用约定
-
ARM 的 CPU 有16个寄存器:r0 到 r15,每隔寄存器为32bit
- r0 – r3:存储传递给函数的参数值
- r4 – r11:存储函数的局部变量
- r12;内部过程调用暂时寄存器
- r13:存储栈指针(sp) – 保存栈顶指针
- r14;链接寄存器(link register)- 存储着当被调用函数返回时,将要执行的吓一条指令的地址
- r15:程序计数器(program counter),存储着当前执行指令的地址,每条程序被执行后,该计数器自增
-
在汇编代码中,以”.”开头的都不是汇编指令,阅读时可以忽略
- 代码中以冒号结尾的代码行(例如
_addFunction
和Ltim0:
),称之为『label』。这些标签的作用是给汇编代码段指定相关的名字,实际上是一个函数的入口 - 这个标签(_addFunction)是必须有的,别的代码调用
addFunction
函数时,并不需要知道该函数具体在什么地方,通过简单的一个符号或者标签就可以进行调用。在最终生成的程序二进制文件时,链接器(link register)会把这个标签转换为实际的地址- 编译器总是会在函数名前面加一个下划线
_
,这是一个约定
- 编译器总是会在函数名前面加一个下划线
- 其他所有的标签都是以
L
开头,这些通常称为局部标签(local label),只会在函数内部使用 - 注释是以
@
字符开头