codecamp

Assembly 数制

计算机里的内存由数字组成。计算机内存并没有以十进制(基数为10)来储存这些数字。因为计算机以二进制(基数为2)格式来储存所有信息能极大地简化硬件。首先让我们看一下十进制数制。

十进制

基数为10的数制由10个数码(0-9)组成。一个数的每一位有基于它在数中的位置相关联的10的乘方值。例如:

十进制

二进制

基数为2的数制由2个数码(0和1)组成。一个数的每一位有基于它在数中的位置相关联的2的乘方值。(一个二进制数位被称为一个比特位)例如:

二进制

这些演示了二进制如何转换成十进制。表1.1展示了开始的几个十进制数是如何以二进制替代的。

二进制中十进制0到15

二进制加法

图1.1演示单个的二进制数字(也就是:位)相加。下面是一个例子:

单个的二进制数字

如果有人考虑了下面的十进制的除法:

十进制的除法
他可以看到这个除法除去了这个数的最右边的十进制数而且将其它的十进制数向右移动了一位。除以2也是同样的操作,除了是为了得到一个数的二进制位外。考虑下面二进制数的除法:

二进制数的除法
这个现象可以用来将一个十进制转换成它的等价的二进制表示形式,像图1.2展示的一样。这种方法首先要找到最右边的数位,这个数位被称为最低的有效位(lsb)。最左边的数位称为最高的有效位(msb)。内存的基本单元由8位组成,称它为一个字节。

十进制转换

十六进制

十六进制数使用的基数为16.十六进制(或者简短称为hex)可以用作二进制数的速记形式。十六进制需要16个数码。这就产生了一个问题,因为没有符号可以用来表示在9之后的额外的数字。通过协定,字母被用来表示这些额外的数字。这16个十六进制数字是0-9,然后A,B,C,D,E和F。数A等价于十进制的10,B是11,等等。一个十六进制的每一位有基于它在数中的位置相关联的16的乘方值。例如:

16的乘方值

将十进制转换成十六进制,可以使用和二进制转换同样的方法,除了除以16外。看例图1.3.

十进制转换成十六进制

十六进制非常有用的原因是因为十六进制和二进制之间转换有一个非常简单的方法。二进制数非常大而且非常频繁。十六进制提供一个比较舒服的方法来表示二进制数。

将一个十六进制数转换成二进制数,只需要简单地将每一位十六进制数转换成4位二进制数。例如:转换成。注意在这些4位二进制数中领头的0非常重要!如果中间的那位的4位二进制数的领头的0没有使用的话,那么结果就是错的。从二进制转换成十六进制同样简单。只需反过来做刚才那个处理,将二进制每4位一段转换成十六进制。从二进制数的最右端开始,而不是最左端。这样就能保证处理过程使用了正确的4位段,例如:

内存单元

一个四位的数被称为半子节。因此每一位十六进制相当于一个半子节。两个半子节为一个字节,所以一个字节可以用两位十六进制数来表示。一个字节值的范围以二进制表示为0到11111111,以十六进制表示为0到FF,以十进制表示为0到255.
Assembly 环境设置
计算机内存和CPU的基础知识
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }