深入iOS系统底层之汇编语言

秉心识本源,於事少凝滞。-- 《信行远修水筒》

了解一个系统的唯一途径就是去阅读源代码

要想完全的了解一个系统唯一的方法就是去阅读这个系统的源代码实现!这个原则对于一个iOS程序员也是如此。很幸运的是我们现在处于一个开源代码迸发的美好时代(这里要感谢理查·马修·斯托曼以及他的GNU计划),很多优秀的库都以源代码的形式呈现给大家,甚至连iOS这种封闭的系统也迫于某种压力开放了部分源代码(虽然开放的部分并不一定和真实的相同),这也已经足以给了我们很多热情去窥探其内部的一些实现机制。目前网络上也有非常多的基于苹果的开源而介绍OC2.0的runtime原理以及runloop实现机制以及类的+load方法执行时机等等方面的文章。

当我们希望走更远时就会发现有一座大山阻挡着我们的去路。因为系统的闭源特性使得我们无法阅读到其中所有的源代码以及核心实现。那么是否我们就只能裹足不前了呢?

回答是NO!

源代码有高级形式的源代码也有低级形式的源代码。当我们被高级形式的源代码所阻时,低级形式的源代码却依旧为我们敞开着大门,就看你愿不愿意去找那把钥匙并打开它。低级形式的源代码是什么呢? 答案就是机器指令!!

我们知道凡是满足某个操作系统ABI规则的应用程序源代码最终都会编译和链接为某种特定格式的一条条机器指令并在CPU上执行。如果说程序的高级语言实现对于一个程序员来说是它的源代码的话,那么对于CPU来说一个程序的机器指令序列就是它的源代码。只不过机器语言对于很多人来说异常的晦涩难懂而已。

很高兴的一件事情就是虽然机器语言晦涩,我们的前辈们发明出了一种所谓机器语言的助记语言:汇编语言

汇编语言中的每条命令虽然几乎和每条机器指令一一对应,但是却增强了程序的可读性,使得我们面临的不再是一串干巴巴的二进制数字了。君不见目前很多的反编译工具以及即使是XCODE上我们都能看到汇编语言的场景。正是因为汇编语言的出现使得我们在阅读和分析源代码上就进了一大步!

当你精通汇编语言时!你看到的所有代码都将是源代码!

有人说汇编语言相对于高级语言来说依然晦涩难懂,但这其实并不是绝对的。曾记得中国第一代程序员的求伯君以及雷军这些前辈们最早接触的就是汇编语言,而且他们也都是用汇编语言进行程序编写的。就因为汇编语言离机器语言太近了,所以大家都会有一种望而生畏的感觉。诚然这些低级语言并没有像我们使用的高级语言那样更加符合自然语义和语法规则,但是它的优点就是非常的直接和单纯。当你深入的应用它时就会发现汇编其实并没有那么的复杂。在一个程序的机器指令中,大部分的指令代码所做的事情除了计算外就是将数据在寄存器与寄存器之间以及寄存器与内存之间进行移动。在高级语言中我们可以定义非常个性化的变量以及无限制的变量,而在低级语言中我们则只能使用那几个有限的寄存器来作为临时变量,以及像访问数组那样去访问内存地址。

下面的一张图可以看到实现一个累加功能代码片段的机器语言和汇编语言以及高级语言之间的差别:

机器语言、汇编语言、高级语言

看上面的代码时也许你对高级语言所表达的意义一目了然,而对于汇编语言的表达也许仔细多读几遍就能了解其意义,而对于机器语言则可能是一头雾水了。

说了这么多,也许有人会问汇编语言和我想要深入iOS系统底层有什么关系!

好问题! 答案就是iOS系统的封闭性,使得我们无法窥探到很多系统的底层实现, 并且当我们被某种问题或者某个实现原理所困扰却不得其法时,就可以通过对系统进行反编译而得到汇编语言来了解和阅读其实现原理;当我们面临突如其来的运行时崩溃时,就可以通过阅读汇编语言来了解其产生的原因;当我们的crash并没有上下文时,就可以通过汇编语言来定位和解决问题;当我们想解决某个问题而想做动态下发补丁时我们也可以借助汇编语言来完成;当我们想在越狱的机器上hook住某些应用时我们可以通过汇编语言来完成功能;当我们想最大的优化我们的系统以及某些关键部分的代码的性能时我们可以借助汇编语言;当我们想当一个黑客时我们可以借助汇编语言...,我们能借助汇编语言做的事情实在是太多太多了。 现在的应用编程语言都是越来越向高级语言发展,而呈现出简单化、智能化从而导致进入的门槛越来越低。越高级的语言因为其封装性就越离底层实现原理越远,你所能窥探的东西就越少,因此低级语言还是非常具有顽强的生命力和存在必要性的。君不见iOS所开源的runtime的源代码里面关于objc_msgSend函数的实现就是用汇编语言来编写的!这样的目的就是让这个函数的性能得到最大的优化。

所以说掌握和了解汇编语言知识不仅是进入iOS系统底层并且也是进入所有系统底层的一把钥匙,当你精通或者了解一些基础的汇编语言知识和技巧时,你就打开了通往一切都是源代码的大门。值得一提的就是我并不打算详细的去介绍关于汇编的一切,其实我们只要了解一些基础的汇编知识就能非常方便的帮助我们解决很多的事情。

👉【返回目录


欢迎大家访问我的github地址简书地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容