前言:
匯編語言是個直接操作CPU的語言刊驴,有些 app 開發(fā)里的非常重要的部分都用匯編開發(fā)芦倒,這就是所謂的內(nèi)聯(lián)匯編。能夠使用內(nèi)聯(lián)匯編開發(fā)的都是讓我膜拜的大神被丧。
一. 8080地址尋址的相關知識
今天讓我們來學習一下8086CPU的一些相關知識吧乱顾。
CPU訪問內(nèi)存單元的時候板祝,要給出內(nèi)存單元的地址。所有的內(nèi)存單元都有一個唯一的地址糯耍,叫做物理地址扔字。
8086 呢 是個很奇葩的 CPU 囊嘉,它的地址總線有 20 根温技,,可以傳送 20 位的地址扭粱,也就是 2^20 = 1M 的尋址能力舵鳞。
但是呢,8086 又是 16 位結構的CPU琢蛤,一次發(fā)電只能使用 16 根地址總線蜓堕,所以它內(nèi)部能夠一次性處理抛虏,傳輸?shù)臅簳r存儲的地址為 16 位。
所以如果只是簡單的將地址從內(nèi)部發(fā)出到內(nèi)存尋址套才,那么他就只能發(fā)出16位的地址表現(xiàn)出來的尋址能力只有 2^16 = 64K迂猴。1M的地址空間,最后只能 64K 尋址背伴,那么就會造成很大的內(nèi)存浪費沸毁。
所以 8086 通過地址加法器將兩個 16 位地址相加進行地址合成 , 合成20位的物理地址傻寂,那么就能夠訪問所有的內(nèi)存空間了息尺,是不是很牛逼,哈哈疾掰。
如下圖搂誉,地址加法器的相關流程:
地址合成
所以物理地址就通過 物理地址 = 段地址(基地址) * 16 + 偏移地址 的方式將段地址和偏移地址合成一個物理地址静檬。
那么具體的相加就如同如下圖一樣的流程
-
觀察一下下圖的地址炭懊,看看有什么發(fā)現(xiàn)?
地址
沒錯拂檩,只要段地址和偏移地址相加的結果是相同的凛虽,那么就可以使用在范圍內(nèi)的不同的16位段地址和偏移地址進行相加。
比如:CPU要訪問 21F60H 的物理地址广恢,則給出的段地址 SA 和 偏移地址 EA 滿足 SA*16+EA = 21F60H 即可凯旋。
內(nèi)存分配管理
8086是用“基礎地址(段地址×16) + 偏移地址 = 物理地址”的方式給出物理地址。
-
為了開發(fā)方便钉迷,我們可以采取分段的方法來管理內(nèi)存至非,比如:
地址分段- 地址10000H~100FFH的內(nèi)存單元組成一個段,該段的起始地址(基礎地址)為10000H糠聪,段地址為1000H荒椭,大小為100H
- 地址10000H1007FH、10080H100FFH的內(nèi)存單元組成2個段舰蟆,它們的起始地址(基礎地址)為:10000H和10080H趣惠,段地址為1000H和1008H,大小都為80H
-
在編程時可以根據(jù)需要身害,將若干連續(xù)地址的內(nèi)存單元看做一個段味悄,用段地址×16定為段的起始地址(基礎地址),用偏移地址定位段中的內(nèi)存單元
- 段地址×16必然是16的倍數(shù)塌鸯,所以一個段的起始地址(基礎地址)也一定是16的倍數(shù)
- 偏移地址為16位侍瑟,16位地址的尋址能力為64KB,所以一個段的長度最大為64KB
-
如果說給定一個段地址,只通過變化偏移地址來進行尋址涨颜,那么最多可以定位多少個內(nèi)存單元呢费韭?
- 結論 偏移地址16 位變化范圍0~FFFFH,僅用偏移地址來尋址最多可尋 64K 的內(nèi)存單位庭瑰。
在8086PC機中星持,存儲單元的地址用兩個元素描述,即段地址和偏移地址弹灭《ず梗“數(shù)據(jù)在21F60H內(nèi)存單元中”,這句話對于8086PC 一般不這樣講鲤屡。取而代之的是兩種類似的說法:a. 數(shù)據(jù)存儲在 2000:1F60單元中损痰。b:數(shù)據(jù)存儲在內(nèi)存的2000H段中的1F60H單元中。這兩種都表示“數(shù)據(jù)在21F60H內(nèi)存單元中”酒来。