一、什么是汇编语言
人类操作计算的能力需要使用一种方式来表达、需要使用一种方式来实现。目前,都是通过编程来实现的,简单来说,就是告知计算机要遇到什么情况怎么处理。既然是告知,那么就需要使用语言。计算能够直接听懂的语言就是机器语言,什么是机器语言?其实就是一大堆的01序列。例如,01010101011000。那么这句话表达的是什么意思呢?人类是不是很难看懂!
所以人类就对机器语言进行了一些简化。例如,机器语言01000000,就使用add来代替;例如,机器语言01000000,就使用sub来代替。这种把机器能沟听懂的只包含01序列的语言,使用助记符来优化的语言就是汇编语言。
虽然汇编语言相对于机器语言来说更加易懂,但是对人类依然不是很友好。所以,人类就对汇编语言进行优化,进而发展出高级语言,像C、C++、Java、OC、Swift等。
二、汇编语言的特点
与高级语言相比,汇编语言具有以下特点:
- 高级语言操作的是内存
- 汇编语言可以操作内存和寄存器
- 汇编语言不可移植(其与具体的芯片相关,所以不可移植)
三、iOS设备与汇编语言的版本
编号 | 汇编语言的版本 | 适用设备 |
---|---|---|
1 | armv6 | iPhone、iPhone2、iPhone3G,第一代iPod Touch、第二代iPod Touch |
2 | armv7 | iPhone3GS、iPhone4、iPhone4S,iPad、iPad2,iPad3、iPad mini,iPod Touch 3G、iPod Touch 4 |
3 | armv8 | iPhone5、iPhone 5C,iPad 4 |
4 | armv64 | iPhone5S 以后,iPad 4以后 |
备注
本文的汇编只包含Arm64
四、内存
一个进程可用的地址空间如下图所示。
对于程序员来说,其看到的内存空间是连续的,实际内存的空间是破碎的——由于同时有多个进程存在,每个进程都会占用不同的内存空间,但是这个问题由操作系统为我们解决——它提供了虚拟内存。一般情况下,在程序员眼中,内存作为一个连续的内存空间使用即可。
五、学习汇编需要了解的几个内容
5.1 寄存器
对于日常使用高级语言的程序员来说,其看到的是连续的内存空间。但是对于使用汇编的程序原来说,其面对的主要是寄存器。事实上,CPU内部也是分为运算器、控制器、寄存器、多级缓存。对于基于汇编语言的程序开发来说,寄存器是必须了解的一个概念,下文会对寄存器进行详细解释。
5.2 汇编指令
高级语言一般使用if、for等关键字来表达;对于汇编语言来说,我们使用汇编指令来进行表达,例如sub、mov、add等。我们所学习的arm系列汇编是精简指令集的,其比intel系列的汇编要件的多。对于汇编指令可以先学习简单的几个,然后再碰到不理解的,就去查资料。
ARM汇编开发指用ARM提供的汇编指令,进行ARM程序的开发。ARM汇编开发,有两种开发方式,一种是使用ARM汇编,一种是使用ARM GNU汇编。两种汇编开发,使用的汇编指令是完全一样的,区别是宏指令,伪指令,伪操作不一样。其实两种开发方式的区别在于所使用的编译工具不一样。对于ARM汇编,使用的是ARM公司开发的编译器,而ARM GNU汇编,是使用GNU为ARM指令集开发的编译器,也就是arm-gcc。不过这些差异一般都集中在宏指令,伪指令,伪操作几方面,对于我们入门学习影响不大。
5.3 堆栈
我们都知道函数调用涉及到堆栈的管理,理解函数调用、嵌套函数等需要了解堆栈。下图展示了函数A调用函数B后的堆栈示意图。