回归母语
其实我也学过不少程序语言了吧,C,Java,Python,Matlab,R等等,但是每一种我都没有学到很精通的地步,一来是因为确实和工作比较远,二来确实自己也还是比较懒。学习时候遇到困难就总喜欢抱怨,这种语言好啰嗦,那种语言好麻烦,这个定义不清晰,那个语法太奇葩之类的,一直幻想有没有一种通用的计算机语言,可以把不同语言转换成一种,这样我们就可以只学一种语言,只要转换成通用语言就可以和其他语言编写的程序一样使用了。可是,你们也知道我的幻想在某种意义上其实并不存在,但是其实你们也知道我的幻想在另外一种意义上其实早就是现实了。有一次在群里聊这个话题,被嘲笑了,大家说你可以去学汇编语言啊,是啊,说起来好尴尬,我真的没有学过汇编语言啊,而且我似乎从来没想过要去学(T_T),我一直以为那就是给计算机读的语言…直到前不久,突然内心膨胀去参加CTF比赛,一头雾水没有做出一道题的情况下,也还是看了看IDA,跟着别人的writeup试着反编译,我才发现其实汇编语言是给人类看的,只有二进制才是真的为计算机定制的语言,然而即便是二进制,人类也是可以看得懂得。
终于发现,其实所有的编程高级语言,不过是汇编语言的抽象化,最终都要翻译成汇编语言的,这么看起来,汇编语言才是编程的母语。既然我的其他语言学得都不好,先把母语学学可能会有帮助吧。
做个小笔记
最近开始看一本有趣的书《30天自制操作系统》,作者是川合秀实,当然我看的是中译本(日语还没有学到可以读书的水平T_T)。书里讲了很多汇编语言的语句,我准备在这里做一个小笔记,把这些语句的意思记录下来,这样下次遇到的时候我就不用到处查了,回来翻翻自己的博客就好啦(有些懒)。下面的这些都是整理自《30天自制操作系统》的内容哦
常见的几个汇编语句及其含义:
- MOV :move,意思是移动,实质是赋值。源数据和目的数据必须位数相同。
- JMP :jump,意思是跳转。
- ORG :origin,意思是源头,起点,实质是指定程序开始的地址。
- ADD :add,相加
- BYTE:使用的存储单元只是地址多指定的字节。
- WORD:地址所指定的字节的相邻一个字节也会成为指令的操作对象。
- DWORD:与WORD相邻的两个字节都会成为指令的操作对象。
- CMP :compare,比较指令
- JE :jump if equal, 条件跳转指令,如果比较结果相等就跳转,不等就不跳转
- INT : interrupt , 软件中断指令。
- HLT :halt,让CPU进入待机状态。
- JC :jump if carry,如果进位标志是1就跳转,否则不跳转。
- JNC:jump if not carry,如果进位标志是0就跳转,否则不跳转。
- JAE :jump if above or equal,大于或等于时跳转,否则不跳转。
- JBE :jump if below or equal,小于等于则跳转,否则不跳转。
- JB :jump if below,如果小于则跳转
- RESB: reverse byte, 预留字节
- DW:define word
- DD:define double-word
- DB:define byte
还有一些常用的寄存器的名称,也很重要的感觉。
8个16位寄存器:
- AX :accumulator,累加寄存器
- CX :counter, 计数寄存器
- DX :data,数据寄存器
- BX :base,基址寄存器
- SP :stack pointer,栈指针寄存器
- BP :base pointer,基址指针寄存器
- SI :source index,源变址寄存器
- DI :destination index,目的变址寄存器
16位段寄存器:
- ES :extra segment,附加段寄存器
- CS :code segment,代码段寄存器
- SS :stack segment,栈段寄存器
- DS :data segment,数据段寄存器
- FS :没有名字的段寄存器
- GS :没有名字的段寄存器
8个8位寄存器:
- AL :累加寄存器低位
- CL :计数寄存器低位
- DL :数据寄存器低位
- BL :基址寄存器低位
- AH :累加寄存器高位
- CH :计数寄存器高位
- DH :数据寄存器高位
- BH :基址寄存器高位
8个32位寄存器:
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI,这里的E就是Extend的意思,就是在16位寄存器的基础上扩展了的意思
信而美
看完了这些汇编语言,我才发现,其实计算机的语言本质也很简洁啊,比文言文还要简洁啊,如此甚好。之前在看《操作系统之哲学原理》的时候,有一章的引子叫“信言不美,美言不信”,我一时间不理解为什么用这个标题。看完汇编语言之后,我大概有些理解了。那么多的高级语言,看起来很美,但是执行的过程中就会有一些不可靠的情况,而汇编语言,虽然看起来不美,但是执行起来是不大折扣的。
信言不美,美言不信,固然是现实,但是理想主义者的心理总有一种追求,可不可以既信又美呢?如果可以出现一种信而美的语言,是不是可以拯救满是bug的世界呢?(白日梦模式已经开启)
到底是什么导致信言不美,美言不信呢,仔细想想,可能是对美的追求有些不切实际呢,其实《30天自制操作系统》这本书里也有提到,程序写的在漂亮,执行时候出问题也白搭,还不如程序写的容易执行但是看起来不那么漂亮。
就让我从白日梦开始,学习编程吧。