ios汇编教程1

来源:互联网 发布:易辅客栈模块源码 编辑:程序博客网 时间:2024/05/23 19:44

form http://www.raywenderlich.com/37181/ios-assembly-tutorial 

当你写objective-c代码的时候,它最终将会变成机器码,ARM CPU能理解的1和0,而在objective-c代码和机器码之间,还有一门人类可以读懂的语言——汇编。

理解汇编可以帮助你很好地调试和优化你的代码,帮助你计算objective-c的运行时间,当然也可以满足你想深入窥视底层的好奇心。
在本ios汇编教程内,你可以学习到:
汇编是神马——你为什么需要关注它。
如何读懂汇编——特别是从objective-c方法生成的汇编语句。
如何从汇编的角度来调试程序——这对洞悉程序的运行以及查找了解bug和crash是如何产生的有很大的帮助。
为了能够从本教程获得更多,你必须已经熟悉objective-c编程,你也必须了解一些简单的计算机科学的概念,比如栈,CPU以及他们是如何工作的。如果你对CPU不熟悉,你可能需要停下来先去http://www.howstuffworks.com/microprocessor.htm看看相关的知识。打开你的xcode,准备和我一起深入ARM内部一窥究竟吧。
起始:神马是汇编?
objective-c通常被认为是一门高级语言。你的objective-c代码被编译器编译成汇编代码:低级,但是不是最低级。
这个汇编代码会被汇编器汇编成机器码,也就是CPU可以读懂的1和0。幸运的是,你不需要担心机器码,但是深入理解汇编在某些时候是相当有用的。
每个汇编指令都被设计来告诉CPU执行一个命令,比如“把这两个数相加”或者“取出这部门内存中的内容”。
除了主要的内存——比如iphone5的1G内存、又或许你的Mac上面的可能有的8G(又或者是其他大小),CPUs同样也有一点点可以被快速访问的内存。这些内存被分给寄存器(registers),就像是可以存放某个值的常量。
所有的ios设备(事实上,几乎现在所有的移动设备)使用基于ARM架构的CPUs。幸运的是,这是一个很容易读懂的指令集,尤其是因为它属于精简指令集,这意味这它只需要使用很少的指令。不管如何,它比x86指令集要易读得多。
一个汇编指令(或者语句)就像下面这样:
mov r0 #42
汇编有很多的指令和操作码,mov是其中之一,负责move数据,在ARM汇编中,目标地址是放在前面的,所以上面的指令就是move 42 到寄存器ro中。思考下面这个例子:
ldr r2,[r0]
ldr     r3,[r1
add     r4,r2,r3
不用担心,我不是要你们现在就理解上面这段程序。但是你应该可以大概的揣摩出上面这段代码是做神马的。这段指令是从内存中加载两个值,将他们存储在寄存器r2和r3中,然后将他们两个相加,并将结果存在寄存器r4中。
现在你知道学习汇编并不恐怖了吧?让我们来再深入一点吧。