文章也同時(shí)在個(gè)人博客 http://kimihe.com/更新
引言
本章節(jié)著重闡述x86的內(nèi)存尋址機(jī)制,理解內(nèi)存尋址是一項(xiàng)艱苦的過程,但是一旦掌握其中的精髓,將會(huì)收獲一生受用(程序員生涯)的技能,這是令人激動(dòng)的。
我在本科以及考研期間,都有系統(tǒng)地學(xué)習(xí)過《微型計(jì)算機(jī)原理與接口技術(shù)》,其中涉及到匯編的部分詳細(xì)地講解了內(nèi)存尋址,因此這一次在本書中再次看到這方面的知識(shí),是懷著一種懷舊和重溫的心境的。本以為之前已經(jīng)學(xué)得不錯(cuò)了,這次再讀,果然如作者所說,會(huì)有新的知識(shí) GET DA☆ZE!!!
作為一名從計(jì)算機(jī)專業(yè)科班出身的人來說,將來不管是做什么,可能都或多或少無法割離編程了,甚至可以說編程的影響已經(jīng)深入我的生活中,它是一種思維方式。而計(jì)算機(jī)也幾乎是我們謀生的首選技能,當(dāng)然一味地以金錢和收入來衡量計(jì)算機(jī)專業(yè)的價(jià)值是對(duì)這門科學(xué)的不尊重。大家可以看到現(xiàn)在軟件行業(yè)門檻低,收入高,非常多的人趨之若鶩,大多是以追求高收入為首要目標(biāo),真正從心底熱愛它,撇去名利地想去鉆研它的人還是非常少的。這里我不會(huì)去評(píng)價(jià)這種現(xiàn)象,它存在必然有它的合理性。但不管我們是以何種動(dòng)機(jī)踏入計(jì)算機(jī)科學(xué)的領(lǐng)域,我們都希望在這方面做得出色。,至少能夠做一名優(yōu)秀的程序員。
想做到這一點(diǎn),需要我們付出艱苦的努力,我現(xiàn)在越來越感受到基礎(chǔ)知識(shí)的重要性,有一個(gè)好的計(jì)算機(jī)專業(yè)基礎(chǔ),將會(huì)極大提高我們學(xué)習(xí)新知識(shí)的能力。而在基礎(chǔ)知識(shí)中,我認(rèn)為底層方面計(jì)算機(jī)的基本原理是非常重要的,這也是為什么我會(huì)在互聯(lián)網(wǎng)時(shí)代還會(huì)去學(xué)一門不少人嗤之以鼻的匯編語言。本身我業(yè)余興趣是做iOS,iOS做到后來需要強(qiáng)力的C語言支持,而C語言又會(huì)牽扯出更多底層的知識(shí):Linux,數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)網(wǎng)絡(luò),操作系統(tǒng),算法等等。恰恰這也是各大一流企業(yè)所看重的基本技能。所以,如果你想成為一個(gè)優(yōu)秀的程序員,可能就需要在這些方面花點(diǎn)精力進(jìn)行提高了。當(dāng)然,學(xué)習(xí)的知識(shí)有很多,不局限與我所說的,如果你有興趣和我一起學(xué)習(xí)計(jì)算機(jī)底層的知識(shí),那將是我的榮幸,非常歡迎你的加入!
我們開始吧!
摘錄
以下皆基于intel x86 CPU的架構(gòu)。
- 內(nèi)存尋址有三種模式:1. 實(shí)模式平面模型(real model flat model); 2. 實(shí)模式段模型(real model segmented model); 3. 保護(hù)模式平面模型(protected mode flat model);
- 內(nèi)存系統(tǒng)中的地址線根數(shù)和存在在每個(gè)位置上的數(shù)據(jù)的位數(shù)之間沒有必然的關(guān)系。如16根地址線可以尋址64K字節(jié),但在每個(gè)位置可以存在8位位二進(jìn)制數(shù),也能同樣存在16位或者32位數(shù)據(jù)。
- 距離內(nèi)存底部256字節(jié)的地址為0100H,這前256個(gè)字節(jié)叫程序段前綴PSP(Program Segment Prefix),里面包含各種零碎消息和一個(gè)用于程序磁盤輸入輸出的通用內(nèi)存緩沖區(qū)。
- 兆字節(jié)本質(zhì):一個(gè)1M字節(jié)的內(nèi)存,由包含20根電線的地址總線連接的,計(jì)算機(jī)內(nèi)部的一些內(nèi)存芯片組合。通過向那20根地址線提供20位地址來標(biāo)識(shí)1MB中的一個(gè)字節(jié)。
- 現(xiàn)代CPU利用某技術(shù)把自己暫時(shí)變成一個(gè)8086,這叫虛擬86模式(virtual-86 mode)。
- 在實(shí)模式分段模型中,段是一個(gè)內(nèi)存區(qū)域,它從一個(gè)段落(paragraph)邊界開始,并擴(kuò)展到一定數(shù)量的字節(jié)。在實(shí)模式分段模型中,這個(gè)數(shù)量小于或等于64K(65536)。因此,任何能被16整除的內(nèi)存地址都被稱為一個(gè)段落邊界(paragraph boudary)。
- 因?yàn)橐粋€(gè)段可能開始于任何一個(gè)段落,所以把段開始的那個(gè)段落邊界的編號(hào)叫做該段的段地址。
- 實(shí)模式1M內(nèi)存中,段落大小:16字節(jié);段落編號(hào):0~0FFFFH,共65536個(gè);一個(gè)段大?。?的16次方,64KB。最高的段地址為0FFFFH(對(duì)應(yīng)內(nèi)存地址0FFF0H),它距離實(shí)模式1MB內(nèi)存最頂部(對(duì)應(yīng)內(nèi)存地址0FFFFFH)16個(gè)字節(jié)。
- 段可以開始于任意段地址,共有65536個(gè)段地址均勻地分布在實(shí)模式下滿滿1MB內(nèi)存中,每?jī)蓚€(gè)段地址之間相隔16字節(jié)。一個(gè)段最大可達(dá)64KB,但并不一定非要那么大。此外,段也是可以重疊的。
- 實(shí)模式段模型中,20位內(nèi)存地址需要放到16位的寄存器中,這就需要2個(gè)寄存器來工作。通過[段地址: 偏移地址]的方式來進(jìn)行。
- 用兩個(gè)16位寄存器表示一個(gè)20位地址,就是把段地址放入一個(gè)16位寄存器,把偏移地址放入另一個(gè)16位寄存器。兩個(gè)寄存器一起,共同標(biāo)識(shí)實(shí)模式1MB內(nèi)存中1048576(2的20次方)個(gè)字節(jié)中的一個(gè)。
感想
讀懂了尋址也就讀懂了匯編。