新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 第4章 內(nèi)存數(shù)據(jù)(X86匯編教程)

第4章 內(nèi)存數(shù)據(jù)(X86匯編教程)

作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
內(nèi)存,儲(chǔ)存臨時(shí)數(shù)據(jù)的地方.在運(yùn)行中的程序.正在看的圖片,正在編輯的文本,你現(xiàn)在在看的這章教程,一律都被拷貝一份在內(nèi)存里.
這一章講的就是內(nèi)存數(shù)據(jù)了.現(xiàn)在的電腦,內(nèi)存都上G了吧.但是,你知道么?在電腦剛開機(jī)那會(huì)兒,最多能用1MB的內(nèi)存!這是因?yàn)镃PU其實(shí)有幾個(gè)模式,實(shí)模式和保護(hù)模式,以及64位模式,(再往后的更強(qiáng)大的模式我就不說了,因?yàn)?.....我也不知道!)訪問內(nèi)存,就需要尋址,剛開機(jī)的時(shí)候,CPU在實(shí)模式下,什么是實(shí)模式呢?那是很久以前的CPU的16位模式,那時(shí)候的電腦內(nèi)存只有1MB,也就是說尋址方式只要夠?qū)ぶ?MB就行了.自然不可能數(shù)G內(nèi)存都用上.后來80386CPU的32位保護(hù)模式出來了(其實(shí)中間有個(gè)80286,從286開始就有保護(hù)模式了,不過似乎不是32位的),386保護(hù)模式的寄存器是32位了.能尋址4GB內(nèi)存(暫時(shí)只教實(shí)模式,保護(hù)模式之類就不詳細(xì)說了.以后再看看能不能也寫進(jìn)這教程里)現(xiàn)在新出現(xiàn)的80686有64位模式,寄存器是64位的.
嘛,說重點(diǎn),實(shí)模式的尋址方式.內(nèi)存是一維的,數(shù)據(jù)都按照一條線排列,訪問內(nèi)存需要提供一個(gè)內(nèi)存地址.內(nèi)存第1個(gè)字節(jié)的地址是0,(電腦數(shù)學(xué),0是起點(diǎn)),恩,就是那樣,第2個(gè)字節(jié)的地址是1.依次類推.尋址方式就是訪問內(nèi)存提供地址的方式.在實(shí)模式里,寄存器有16位,也就是說單獨(dú)一個(gè)寄存器能表達(dá)的地址最多只有64KB(請(qǐng)自行驗(yàn)證,驗(yàn)證方法:用計(jì)算器的二進(jìn)制模式,輸入16個(gè)1,轉(zhuǎn)10進(jìn)制)
64KB啊!那明顯不夠用啊!所以,實(shí)模式尋址使用2個(gè)寄存器進(jìn)行尋址,按照"段:偏移"的方式尋址.
前面說過段寄存器CS,DS,ES,SS,就是專門用來尋址用的,存儲(chǔ)"段"那部分的數(shù)據(jù).至于"偏移"部分的數(shù)據(jù)嘛...可以用寄存器BX,SI,DI,SP,IP,BP中的任何一個(gè)來表示,也可以直接用數(shù)字表示.實(shí)例:
CS:BX
CS:1234
那么,"段:偏移"又如何表達(dá)一個(gè)一維地址的呢?請(qǐng)看下邊:
CPU 通過地址線通知內(nèi)存它要操作的地方.在CPU里面有20根地址線,也就是說,"段:偏移"尋址方式只能尋址20位的地址(所以說就算2個(gè)16位寄存器合一起,想尋址32位的內(nèi)存地址那也是不行的...),20位,也就是1MB.那么,把2個(gè)16位的數(shù)據(jù)轉(zhuǎn)換成20位呢?
算法是這樣的:
(段*16)+偏移
恩,段寄存器里面的數(shù)值乘以16(在16進(jìn)制中是10)加偏移地址.
實(shí)例:
段寄存器=15
偏移地址=128
于是尋址得到的內(nèi)存地址為:(15*16)+128=368

恩, 講完尋址方式了.接著講數(shù)據(jù)的低位高位排序.將來在學(xué)習(xí)過程中,你會(huì)碰到一些數(shù)字倒過來儲(chǔ)存的情況,比如說五萬三千二百一十七,儲(chǔ)存在內(nèi)存中卻是 71235,這就是高位和低位按順序排列了,在這個(gè)數(shù)字里,7是個(gè)位,所以在最前,1是十位所以第2.以此類推.也許你已經(jīng)震驚的發(fā)現(xiàn)了,沒錯(cuò),電腦中的數(shù)字沒有反,是我們現(xiàn)實(shí)中用的數(shù)字反了,五萬三千二百一十七我們用53217表示,我們把最高的萬位的5放在了最前面!在寄存器中也是如此,低位在前高位在后.

接著講講匯編中的數(shù)字表示方式吧.在匯編中可以輸入10進(jìn)制2進(jìn)制16進(jìn)制等數(shù)字(當(dāng)然,編譯生成代碼后都是2進(jìn)制.)這么多的進(jìn)制,如果沒有說明,匯編編譯器一定會(huì)弄錯(cuò).那么我們?nèi)绾蜗蚓幾g器表示哪個(gè)數(shù)字是多少進(jìn)制的呢?
我們可以在數(shù)字后邊加個(gè)英文字母表示,2進(jìn)制的數(shù)字在后邊加B,實(shí)例:01110011B 16進(jìn)制的數(shù)字則在后邊加H,實(shí)例:1F3AH,至于10進(jìn)制則不需要,所有的數(shù)字進(jìn)制后邊都有一個(gè)英文字母,那么其中一種進(jìn)制不用也沒關(guān)系的是吧?因?yàn)?0進(jìn)制最常用所以就把后邊不用加英文字母的權(quán)利給了它,在匯編中10進(jìn)制數(shù)字不用特殊表示.
另外,由于16進(jìn)制涉及到了英文字母,ABCDEF,有可能和匯編代碼弄混,所以,如果16進(jìn)制第一個(gè)數(shù)字是英文字母,則必須在前面加個(gè)0.
實(shí)例:
A2H
必須寫成:
0A2H

好了,本章就說道這里了~


評(píng)論


技術(shù)專區(qū)

關(guān)閉