0%

汇编语言入门九:总结与后续(闲扯)

原文链接

回顾

前面扯了一些个汇编语言的内容,想必读者也应该有了大致的了解。笔者比打算写全面的汇编相关的内容,毕竟目前已经有不少相关的资料了。本入门系列的目的就在于:入门。

完成了入门的任务,入门系列就暂告一段落了。在此,先来对前面提及的内容做一些回顾。前面说到的各项内容大概涉及:

  • 环境配置
  • 寄存器
  • 内存访问
  • 流程控制
  • 函数调用
  • 反汇编
  • 调试

我想,学习汇编中比较容易犯难的几个环节,大致也都覆盖到了。并且教程中也提供了可运行的实例,供读者在学习之后用于验证。

学汇编到底学什么

我想,很多新手在了解汇编语言的时候,难免会遇到各种蛋疼的问题。大致有这样一些情况:

有参考书,虽然书中的知识体系全面,但是内容多却晦涩难懂
内容老旧,一时找不到合适的试验环境来验证,仅仅停留于书本,缺乏强烈直观的感受
各种规范各种环境乱七八糟不统一,讨论汇编时太依赖于特定环境,进一步加大了动手验证的难度
这无疑是给学习者泼来一盆冷水,本来只有3分的热情被灭掉了余下0.3分。

其实学习汇编语言,和学习C语言就有所不同了。你不用想着以后用汇编进行编程,学习汇编语言的首要目标是理解CPU运行程序的时候到底在干什么,你编写的C程序或者其他什么代码在CPU的眼里到底是个什么玩意儿,你能够通过汇编去分析程序的行为,解释一些高级语言下无法解释的现象,等等,才是学习的目标。

也就是说,学习汇编语言,应该抱着理解的目标去学习,理解透彻便足矣,无需做到能够流利地用汇编进行编程。

即便如此,笔者前面所述的各方面入门内容也仅仅是入门。不同人有不同的学习历程、只是背景,笔者很难保证自己觉得足够的入门教程,能够让每个读者都刚好受用。鉴于此,笔者将列出在了解了入门内容后需要关心的内容。

后续

前面也有提到,学习汇编所需要侧重的是理解,而非熟练地编代码。汇编语言更像是一套理论知识,用于分析和解释程序在足够底层时的行为和现象。

与其说学习汇编,不如说是揭开高级语言的面纱,深入到更底层的地方去了解计算机原理,靠近计算机程序的本质。深入理解底层原理,有助于建立对计算机更系统的更深入的认识,面对一些看似诡异的问题时能心中有数,有方法有思路有理据去分析和解决。

要做到这一点,是需要循序渐进慢慢学习的。读者可在后续关注这样一些内容:

继续学习汇编语言

笔者前面所述的入门内容只能保证覆盖了核心内容,并未覆盖到汇编语言相关的方方面面。读者至少要让自己学习汇编知识覆盖面达到足以形成图灵完备的最小集合。

可以从分析高级语言(比如C)去学习汇编语言,如前面所述的反汇编。关注这样一些内容:

  • 指令
  • 寄存器
  • 内存访问
  • 条件跳转
  • 堆栈
  • 程序状态

这些概念不仅在x86体系下,在ARM或是MIPS体系下也适用。仅仅是在不同环境下有不同的思路,有不同的表现形式,但是,核心的概念都是一致的。

计算机组成原理

到这里,便是让你对所有计算机系统的认识有一个大统一。上面说到不同CPU平台下都有相当的共性。组成原理便是对所有计算机系统的大统一,不同平台只是在根据自己的目标特点和偏好在对计算机原理进行应用而已。

组成原理会告诉你,计算机在电路这个层面的本质是什么。

有了上述的汇编、组成原理的认识,同时也还应该去了解计算机操作系统。这里所谓的操作系统是指站在专业的角度,讨论操作系统本质上是在做什么事情,解决什么问题。

这些基础知识将会作为今后进一步学习计算机的坚实基础,基于对计算机、对操作系统的理解,计算机中的一切都将不再神秘,其本质都不过如此,基于自己所学去分析、去理解即可。

学习方法

笔者在学习的过程中,也尝试过总结适合自己的方法,在此也谈一谈自己学习的方式。

虽然微积分揭示了自然现象和数学之间很多本质的东西,但是让一个小学生直接学习的话,难免会困难重重。这里的问题并不在于知识体系不够全面、不够严谨,而在于学习者对微积分没有基本的感性认识,根本不知道是个啥玩意儿(计算期末考试分数的新方法?),即使记住了这些公式和证明,但自身难以去自行演绎,这其实是无效的学习。

所以,借助此例,结合自身经历,笔者认为学习的时候应该先关注下面一些方面:

寻求感性认识

学习一个陌生的东西,我都会尝试先寻求一个感性的认识,感性认识达到什么程度呢?就是做到自己能够用一些简洁的白话,把自己接下来要学习的东西到底是什么玩意儿,给解释清楚,最好能够做到让不明白的人也能听明白。

比如什么是计算机?你能想到的就是你面对的那一台电脑,里面有丰富的的软件,可以做很多有趣的事情。

了解边界

笔者所谓的边界,即接下来要学习的这个东西,能做什么,不能做什么。学习之前明白这一点也非常重要,基于此,便能有一个清晰的目标,对学习后会面对的问题也有一定的底。

比如计算机是无法直接驱动一个火箭上天的,但是能够对航天器的行为进行控制。

让学习可验证

学习过程中自己会思考,会想出很多问题,但是这些问题并非都能从书中找到答案。而在学习过程中要刻意的去养成对知识、对自己的新想法进行验证的习惯。这里面大致是这样的过程:

脑子里冒出来一个想法,可能是疑惑,可能是矛盾
猜想一种最可能的情况来解释
通过实践去验证自己的猜想
总结、回顾(验证后的结果不能解释自己的猜想,会去重新猜)
这里的动手验证不是说真的得去拿个锤子砸钉子,而是说这里的分析、思考、试验、演绎等过程需要落到实处,而不是看到了某个模糊的说法,就这样糊弄过去了。

学习时尽量去给自己建立一个足以验证自己所学的环境,或者至少保证自己有了问题知道怎么样去验证。这将是支撑持续而有效学习的可能性和动力的重要基础。

比如通过编程、调试这样的手段去面对语言学习时的各种不解、各种矛盾的问题。通过编程看到结果、进行试验,透过调试去分析、简化学习中的稳题。有搞不明白的代码了,就赶紧编个程序来验证,尽量根据自己的想法把程序写出花儿来,看看到底都发生了些什么。

Over

关于汇编的专门介绍到此就告一段落了,后续笔者将会出更多相关话题的内容,不过内容的深度和难度都会有所上升,也可能更加抽象。

文中若有疏漏或不当之处,欢迎指正。

编辑于 2016-12-17