地址

程序在内存中,访问内存是几乎每一程序都要进行的操作,计算机对内存编址是线性的,也就是说是一维的,比如256M的内存,地址就应该是从0~(256M-1),这个地址称为物理地址或绝对地址。

1.1 地址表示

​ 但从汇编程序员的角度看,内存却是二维的,要说明一个地址,需要给出两个值,就象你在平面上指定一点需要说出(X,Y)坐标一样,汇编程序员的内存视角也需要两个“坐标”,前一个称为段地址(Segment),后一个称为偏移地址(Offset),该地址称为逻辑地址。

​ 比如“1234:3DF5”就是一个地址。“1F3F:”不是一个地址,因为他只有段地址,没有偏移地址。注意此后的地址都用十六进制表示。

1.2 地址计算

​ 前面提到,计算机编址是一维的,汇编程序员是二维的,那么二者怎么换算呢?由后者到前者的换算方法是,“段地址串”后面加个“0”,然后再加上偏移地址。

​ 比如“1234:3DF5”(十六进制的加减运算参见相关资料)

​ 12340 --串后加了一个0

​ 3DF5

​ -----

​ 16135 --注意此串仍然是十六进制。

​ 所以,汇编程序员眼中的地址“1234:3DF5”就是物理地址(计算机编址):16135。

​ 知道了由后者向前者的转换,那么由前者向后者的转换呢?

​ “不知道”,为什么不知道,继续往下看。

1.3 到底哪个地址对

​ 知道了1.2的地址算法后,我又发现一个问题:

​ “1000:6135”的物理地址是多少呢? 10000+6135=16135。

​ “1001:6125”的物理地址呢? 10010+6125=16135。

​ ......

​ 那么到底哪个对呢?问题的回答是这样的:假设我现在让你按一下“L”键,我可以告诉你如下几种方法中的一种或几种。1 请按一下“L”键; 2请按一下键盘上第四行第十个键;3 请按一下第十列中的第四个键;4 请按一下“K”右边的键;5 按标准指法单击一下右手无名指。

​ 举上面的例子也就是说,同一个地址有很多种表示方式,具体用哪一种,要看实际使用时的情况。但无论用哪种方式,只要能达到目的即可。(实际中该问题一般不会受此问题困扰,但初学时突然想不通)。

1.4 有多少内存可以访问

​ 无论是段地址还是偏移地址都是四位十六进制(如果不够四位,前面补0)。也就是说:总共可以访问的地址说是:0000:0000~FFFF:FFFF。 总共FFFF0+FFFF+1=10FFF0个地址。也就是不到1M的空间。

​ 记住如下结论:

​ *) 不管你实际内存有多少,目前我们只能访问不到1M的空间。

​ *) 而实际上连这1M也用不完。其中上端的384K的址只能读不能写,只能读,一般称为ROM。

​ *) 低端的640K可以读写。但这640K的低端100多K也不能随便写,因此DOS系统使用该区。

​ *) 原来1024M的内存,汇编程序只能使用其中400多K。这段内存的容易相当于一个普通文档的大小。不过这就足够了。