Background Facts:
1. 内存(Memory)地址是从0开始的正整数,且每个只会对应一个byte的数据。硬盘(disk)不是内存,没有类似的地址。
2. 一个byte等于8个bit。
3. 一位十六进制(hex-decimal)的数字可以表示4个bit,那么一个byte便可以用两个hex来表示。例如,0001 1010,这八个bit便可以用0x1A来表示。一个4byte的数字便可表示为0x12348899。
4. 通常为了方便,内存地址会用hex来表示,但是用十进制来表示也是正确的。
5. 决定端序的不是操作系统。
计算机中的内存是用来储存计算中会用到的数据,但很多数据类型都是要大于一个byte的,比如int,short等。那么计算机就要有一套规则来明确这些个byte要按照什么顺序存进内存。举个例子,假设一个int age = 0x12345678,大小是4个byte,我们想把它存在内存地址0x1000上,那么就会占用0x1000-0x1003这四个byte。最简单的方式肯定是像这样:
0x1000: 0x12
0x1001: 0x34
0x1002: 0x56
0x1003: 0x78
这样的顺序我们也称为Big Endian(大端序)。然而,你们手中的电脑绝大部分会采用相反的顺序,Little Endian,即小端序:
0x1000: 0x78
0x1001: 0x56
0x1002: 0x34
0x1003: 0x12
Little Endian并没有说是把整串数字直接reverse,而是以byte为单位把顺序倒了过来,因为端序决定一串byte的顺序。一个常见的错误便是误以为0x12345678的小端序是:
0x1000: 0x87
0x1001: 0x65
0x1002: 0x43
0x1003: 0x21
而且还要注意如果有多个变量的话,每一个都要分开处理,尤其在将assembly翻译为machine code的时候,有些指令会包含一个常数(immediate)。