为什么想学汇编
计算机技术发展日新月异,尤其是软件方面一直在快速迭代,但不管什么软件应用都是运行在操作系统之上的,想深入学习操作系统,汇编与C语言是不得不跨过的一道门槛,为此,我打算先学习下汇编,之后再深入下C语言。
选择学习资料
目前先使用王爽的《汇编语言》与李忠的《x86汇编语言从实模式到保护模式》作为学习参考的书籍。
预备知识
十进制与二进制
从数学的角度来看,二进制计数法是现代主流计算机的基础,正如道家的阴阳学说,一阴一阳这最简单的二元组合,经过精心设计便能化生万物,造化之神妙,先贤科学家构思之精巧,委实令人震撼!
一个十进制数5,它所对应的二进制数是101,而十进制数234243242342对应一大串11011010001001111111000011100101100110。
组成二进制数的的每个位,在计算机当中(信息论)称为比特(bit),二进制数就是一个比特串,数字越大比特串越长,这是一个不好的一面。
二进制到十进制的转换
(这一块李老师的《x86汇编语言》没有《编码》当中对进制描述的那样自然清晰)
在十进制数当中,每个数字的位置有其权重,我们可以把521写成5x100+2x10+1x1 = 5x10^2 + 2x10^1 + 1x10^0, 从右往左开始,以基数为底,权重依次增加,指数依次递升。
既然十进制数字以10为底,都是10的几次幂,那么我们可以推广到2进制,那么二进制可以看作是以2为基底。如101B可以写成 1x2^2 + 0x2^1 + 1x2^0 = 5D(十进制以D作为后缀,二进制为B,16进制为H,八进制O)。
这里在强推《编码》把进制间的转换描述的非常清晰生动,朋友们感兴趣的一定不要错过。
十进制到二进制转换
十进制到二进制的转换,前人发明了好几种方法,这里为了节省时间我只写了入门最常用的取余法。将一个十进制数不断除以二,直到商为0,然后将每次相除时的余数,倒着串联起来,就是它的二进制表示。
如图26的二进制:
这里再提一下,无论什么进制,都是出于对现实世界的抽象表示,数学家们的抽象归纳能力实在变态,不光是现实世界,包括现实中无实体的高纬度空间都包含在内。
二进制是对计算机中电信号的“开”、“关”抽象,10进制源于祖先从我们手指中抽象出来(正常是10指)。
十六进制
二进制有一个明显的缺点,就是数字太长时很不直观,一大串二进制数摔到脸上,多数人都会懵逼的,于是一些科学家发明了16进制计数法,每逢16进1,这自然就要对数字的表示同10进制区分开:
16进制数当然不仅仅是为了写起来省事,咱们再看一个图,每4个比特都是对应16进制中的一位数:
从0000~1111正好对应了16进制中0~F。如果再加1,就变成了0001 0000B(二进制)、10H(16进制)。
那么二进制与16进制之间的转换就一目了然了,如一串长的二进制数
1101 0010 0101 0001 每4个比特对应一个16进制数,就得到了D251H(0xD251).