哈喽,我是子牙,一个很卷的硬核男人。喜欢研究底层,聚焦做那些大家想学没地方学的课程:手写操作系统、手写虚拟机、手写编程语言…

作为一个将汇编、C语言、C++、操作系统融会贯通的男人,一个体会到编程乐趣的男人,我想跟大家分享一下这一切的起始能力:汇编,我会聚集分享学习汇编的意义及真正学会它的方式。会有一点点难学,也就是一点点啦~


01 学习汇编的意义

如果你是从事逆向开发或者底层开发的小伙伴,可能已经深刻认识到汇编的重要性。如果你想成为技术大牛、想研究Linux操作系统或虚拟机,你大概也意识到了没有汇编好像这些都干不了。当然也有小伙伴可能还没认识到汇编的重要性,给大家看张图

如何用纯汇编手写个操作系统_汇编

什么是逆向开发?比如你玩游戏打不过开歪挂,歪挂,就是逆向开发方向。那有歪挂,就有对应的反歪挂,也是逆向开发方向。相关的还有:病读与反病读、迫解与反迫解…这个方向,汇编底子是基本功,缺了就玩不了

我们大多数人其实都是正向开发,相对于逆向开发,没有太大的技术含量,纯粹为了完成公司的业务需求。那既然正向开发没有太大技术含量,为什么还有学汇编呢?

其一,卷出自己的不可替代性。比如大家的水平都停留在Java语言层面,你能玩Java虚拟机,你就比别人有更强的竞争力。如果社会的平均水平是Java语言+Java虚拟机,你能从操作系统层面去理解,你就有更强的竞争力…以此类推。但是你想卷底层,比如Java虚拟机、Python虚拟机、操作系统、MySQL等,你就得有C语言、C++的功底,而你想在C语言、C++上有很深的理解,就得需要汇编

比如精通C语言的条件有两个:一、看到C语言代码,你能脑补出它对应的汇编代码;二、看到C语言代码,你能像电脑一样脑补出它运行时的内存图。这两个条件,只有学习汇编才能做到

其二,计算机这个行业其实是一个很有乐趣的行业,我们的一生,从事一个行业,可能要干二三十年,不去探索这个行业的乐趣,那这二三十年过的得多煎熬呀~从下往上,掌握汇编、C语言、C++、操作系统,你才有可能获得这个行业真正的乐趣。到那一天,基本你想做什么都可以去做,工作方向上,你能看到的机会就更多,你能做的选择也会更多



02 汇编应该怎么学

市面上写汇编的书,讲汇编的视频,一上来就跟你讲内存、汇编原理性的知识、汇编指令怎么用……大家学的一脸懵。我觉得我们应该先搞清楚,学习汇编的目的,以及目标是什么,其次才是学习,这比较符合人做事情的思维:先找到做的意义,其次才是行动

学习汇编的目的是什么呢:一、能看懂反汇编代码,为做逆向开发打下基础;二、为学习上层的C语言、C++、OS、操控硬件打下基础。往细了说就是:

一、清楚的知道编译器编译C语言函数生成的代码结构,这个你可以通过VS2013去查看

如何用纯汇编手写个操作系统_Java_02

二、我们写代码,最常用的就是函数、流程控制、条件判断…你得能很熟练的用汇编去实现,所以我教汇编的时候,给大家留的练习题都是这样的

如何用纯汇编手写个操作系统_操作系统_03

三、单步运行每条汇编指令,观察内存变化。比如栈操作指令:push、pop、call、ret等,记住变化规律,这些规律在自己构建执行流的时候、看反汇编代码的时候,非常有用。这个可以通过在OD上面写代码去练习

如何用纯汇编手写个操作系统_Java_04

四、用汇编写一个完整的项目,把之前学的零散的知识点聚合起来。能写的项目很多,但是我觉得做好的项目,就是用汇编写一个五脏俱全的操作系统:自己构建合规的、不合规的执行流;自己写代码控制中断芯片接管系统中断;自己写代码控制硬盘完成读写;自己写代码控制CPU完成执行流的切换……想想都非常有趣有木有?

上面分享的就是我认为的,这个时代学习汇编的意义,以及真正能够学会汇编的方式。看书、看讲原理的视频,不实战,是不可能真正学会汇编的。关于用汇编写操作系统,市面上基本没资料,所以我写了一个,录制成了视频,需要的可以接着往下看



03 纯汇编手写操作系统

这套课程中,我教汇编的方式,就是我前面说的我觉得最合理的学习汇编的方式,然后再配一个项目:带你用纯汇编手写操作系统,如果你学完真的掌握了,你会有一种实力暴涨的感觉。这可不是我说的,是跟我学习的小伙伴说的

课程学习地址

https://edu.51cto.com/course/33995.html

先看下课程大纲吧

如何用纯汇编手写个操作系统_Java_05

课程里的部分视频是大课【带你手写OS】中的,后面的C语言部分我用汇编重写了,自然就要重新录制视频。需要重新录制的有四节课:8、9、10、11,一周一节,一个月左右完工

购买课程包含视频+笔记+代码+答疑课程配套代码,分支我是按照课时打的,方便大家到时阅读代码

如何用纯汇编手写个操作系统_执行流_06

我提供给大家的代码完成了这些功能:

  1. 实模式切入保护模式
  2. 实现内存检测、物理内存管理模块、虚拟内存管理模块
  3. 实现了输出模块。要知道你用Linux终端,它会自动翻页,这个功能你如果写内核都是要自己实现的
  4. 实现了键盘中断。就是你键盘敲什么,屏幕就显示什么,为后面加入命令行做准备
  5. 实现了时钟中断,通过时钟中断调度任务。与Windows、Linux一模一样
  6. 实现了进程线程、任务切换、阻塞唤醒。当然,任务模块的东西很多,后面会逐步加入
  7. 实现态的切换,由内核态切入用户态发起系统调用
  8. 实现了系统调用模块,通过0x80中断实现应用态对内核态的范围及返回

对用纯汇编手写出操作系统感兴趣的小伙伴可以关注我的课程主页学习哦