什么是匯編語言中的有效地址EA
CPU訪問內存單元時要給出內存單元的地址。所有的內存單元構成的存儲空間是一個一維的線性空間。
每一個內存單元在這個空間中都有唯一的地址,這個唯一的地址稱為物理地址。
8086有20位地址總線,可傳送20位地址,尋址能力為1M。
8086內部為16位結構,其中的寄存器是16位,所以它只能傳送16位的地址,表現(xiàn)出的尋址能力卻只有64K。
8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。
因此,段的概念的引入,就是為了解決8086的寄存器只有16位,而尋址能力卻是20位之間的矛盾。
段地址×16就等于段地址(16進制)左移一位,右邊補0,就像10進制數(shù)乘以10一樣。

圖1中的物理地址生成的規(guī)則是:
CS20000
IP +0000
------------------------------------------------------
=20000(有效地址,物理地址,EA)
段地址和偏移地址可以舉一個例子:
假設有一個賓館,一共有10層,每層有100個房間,每一層的房間從00號到99號。
現(xiàn)在假設這個賓館每一層有一個保安,這個保安只知道樓層號;每層又有一個服務員,每個服務員只知道房間號?,F(xiàn)在這個賓館的管理員要登記這個賓館的全部客戶信息,所以他必須知道賓館的全部房間的客戶信息,為此,他需要對保安的樓層號和服務員的房間號進行處理。
現(xiàn)在,假設管理員登記的房間號是3位,而保安知道的樓層號是1位,比如1層,2層,等等;服務員知道的房間號是2位,比如00號房間,99號房間,等等。那么管理員登記的完整房間號應該是200,215,299等。
這個房間號我們可以認為是這樣得來的:
我們可以規(guī)定保安的樓層號也是2位,比如10代表第1層,20代表第2層,等等,以便和房間號相統(tǒng)一。
那么管理員登記的3位房間號可以規(guī)定按如下規(guī)則得出:
200 樓層號左移一位
+18
--------------------------------------
=218
前面的20就是段號,18就是位移量。
由這個例子,我們似乎可以得出段代表的是樓層,位移量代表的是某一層的房間號,意思很明顯。
但在計算機的內存里面,內存并沒有分段,段的劃分來自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式給出內存單元的物理地址,使得我們可以用分段的方式來管理內存。也就是說,段的存在僅僅是為了得出實際的物理地址的需要而設計的。
從上面的運算規(guī)則我們看到,要產生物理地址,段地址要乘以16,也就意味著,段地址可以是2000(16進制),2001,等等,但生成物理地址的時候,乘以16以后就變成
20000,20010,20020,等等,從這里可以看出,每個段的段地址開始的地方一定是16的倍數(shù)。與前面的賓館例子對應起來,假設保安的樓層號可以是20,也可以是21,22等(我們可以假設每10個房間設置一個保安),那么移位以后就變成200,210,220等等,也就是說,每一段開始的房間號都是10的倍數(shù)。
從上面例子還可以看出,如果每層樓設置一個保安,那么相當于一段的大小是100,如果每
10個房間設一個保安,那么段的大小就是10。
這個道理推廣到計算機內存,那么,每個段最大就是64k(16位的偏移地址的尋址范圍),
比如段號2000,后面4位都可以是變化的偏移量;最小的段就是16個內存單元(4位段地址加上一位偏移地址的變化),比如段號2001,偏移量的變化只能是最后一位。
對于計算機內存來說:

我們可以認為:地址10000H~100FFH的內存單元組成一個段,該段的起始地址( 基礎地址)為10000H,段地址為1000H,大小為100H。

我們也可以認為地址10000H~1007FH、10080H~100FFH 的內存單元組成兩個段,它們的起始地址( 基礎地址 )為10000H和10080H,段地址為:1000H 和1008H,
大小都為80H。
也就是說,同一段內存,我們可以看作是一段,也可以看作兩段、三段等等,原因在于,只要其實際地址是16的倍數(shù),我們就可以看作是段的起始地址。至于同一部分地址空間看作是多少段,則視實際情況而定。
綜上所述,關于有效地址可以總結如下:
1:計算機內存并沒有分段。段的概念的引入,只是為了解決8086的寄存器只有16位,而尋 址能力卻是20位之間的矛盾。
2:只要是16的倍數(shù),這個內存單元的地址就可以看作是某一段的起始地址。
3:段的大小是可變的,最大64k,最小16個字節(jié)。
4:同一部分地址空間可以看作不同數(shù)量的段。