2.5 內(nèi)存
本節(jié)必須掌握的知識(shí)點(diǎn):
u?內(nèi)存的知識(shí)
u?正在運(yùn)行的程序所占的內(nèi)存空間
u?MOV指令對(duì)內(nèi)存的操作使用
在上一節(jié)中介紹了寄存器的知識(shí),知道了寄存器是處理器(CPU)用來(lái)存儲(chǔ)數(shù)據(jù)的领迈。無(wú)論是8位栋烤、16位和32位的寄存器所有的加起來(lái)冀值,它們的數(shù)量也是有限的罪佳,如果我們存儲(chǔ)的數(shù)據(jù)非常多的話痢畜,僅靠這些寄存器存儲(chǔ)數(shù)據(jù)是不夠的敛熬,那這些數(shù)據(jù)要存在哪里呢肺稀?答案是內(nèi)存。接下來(lái)介紹內(nèi)存的知識(shí)应民。
2.5.1【內(nèi)存的知識(shí)】
在計(jì)算機(jī)的組成結(jié)構(gòu)中话原,用來(lái)存儲(chǔ)程序和數(shù)據(jù)的部件叫做存儲(chǔ)器。對(duì)于計(jì)算機(jī)來(lái)說(shuō)诲锹,有了存儲(chǔ)器繁仁,才有了記憶功能,才能保證計(jì)算機(jī)的正常運(yùn)轉(zhuǎn)归园。存儲(chǔ)器分為主存儲(chǔ)器和輔助存儲(chǔ)器黄虱,主存儲(chǔ)器又稱為內(nèi)存儲(chǔ)器【簡(jiǎn)稱內(nèi)存,本節(jié)簡(jiǎn)單介紹內(nèi)存】庸诱。那么內(nèi)存在計(jì)算機(jī)中起什么作用哪捻浦?答案是內(nèi)存是用來(lái)存儲(chǔ)計(jì)算機(jī)正在運(yùn)行的程序和程序運(yùn)行過(guò)程中的數(shù)據(jù)。
那么一個(gè)正在運(yùn)行的程序能占多少內(nèi)存空間哪桥爽?講解這個(gè)問(wèn)題之前先介紹內(nèi)存的數(shù)據(jù)位寬朱灿。
2.5.2【正在運(yùn)行的程序所占的內(nèi)存空間】
內(nèi)存的數(shù)據(jù)位寬是指內(nèi)存在運(yùn)行時(shí),一個(gè)時(shí)鐘周期內(nèi)傳遞數(shù)據(jù)的位數(shù)钠四。有8位盗扒、16位、32位、64位侣灶∠芭【本節(jié)是在32位基礎(chǔ)上講解】。根據(jù)一個(gè)正在運(yùn)行的程序?yàn)槔v解炫隶,如圖2-5-1所示淋叶。
看圖2-5-1中用黑色矩形框選出來(lái)的部分,就是一個(gè)正在運(yùn)行的程序某段程序所占用的內(nèi)存伪阶。那么我們?cè)趺垂芾砩烽荨^(qū)分這些內(nèi)存哪?可以用內(nèi)存編號(hào)來(lái)管理栅贴、區(qū)分斟湃。我們知道最小的數(shù)據(jù)寬度是字節(jié)。每一個(gè)字節(jié)對(duì)應(yīng)一個(gè)單位檐薯,形成相應(yīng)的編號(hào)凝赛,這些編號(hào)我們把它稱作“內(nèi)存地址”。圖2-5-1中內(nèi)存編號(hào)是32位的坛缕,由4個(gè)字節(jié)組成墓猎,32位的尋址范圍是00000000~FFFFFFFF,那么最大的尋址范圍是FFFFFFFF+1赚楚。
1Byte = 8Bit
1KB = 1024Byte
1MB =1024KB
1GB=1024MB
將FFFFFFFF+1轉(zhuǎn)化成十進(jìn)制為4294967296字節(jié),4294967296 Byte/1024/1024/1024=4GB這里就回答了毙沾,一個(gè)正在運(yùn)行的程序能占4GB內(nèi)存空間。那么這4GB內(nèi)存空間是不是都可以訪問(wèn)哪宠页?答案是否定的左胞。這4GB內(nèi)存空間是一個(gè)程序能訪問(wèn)的最大范圍,真正能訪問(wèn)的是該程序已經(jīng)向操作系統(tǒng)申請(qǐng)的內(nèi)存举户,有對(duì)應(yīng)物理內(nèi)存映射的烤宙。如圖2-5-2所示。
內(nèi)存與物理內(nèi)存俭嘁、內(nèi)存條的映射關(guān)系
舉例說(shuō)明:如圖2-5-3當(dāng)前計(jì)算機(jī)只有3G內(nèi)存躺枕,一共有29個(gè)進(jìn)程,那29*4GB=116GB兄淫,這明顯不科學(xué)屯远。一個(gè)正在運(yùn)行的程序,它的最大尋址范圍是4GB捕虽,而它是虛擬內(nèi)存慨丐,只有向操作系統(tǒng)申請(qǐng)了內(nèi)存,有相對(duì)應(yīng)的物理映射泄私,我們才能使用房揭。物理上的內(nèi)存和我們使用的內(nèi)存條中間還有一層映射备闲。
介紹了內(nèi)存知識(shí),那我們?cè)撊绾问褂脙?nèi)存捅暴?
2.5.3【使用內(nèi)存】
在2.4節(jié)中介紹了MOV指令恬砂,MOV指令可以把立即數(shù)移動(dòng)到寄存器,也可以把寄存器的數(shù)據(jù)移動(dòng)到寄存器蓬痒。
在本節(jié)中的MOV指令泻骤,可以讀取內(nèi)存:
[if !supportLists]1、[endif]將立即數(shù)存入內(nèi)存中;
[if !supportLists]2梧奢、[endif]將寄存器中的數(shù)據(jù)存入到內(nèi)存中狱掂。
【注意:寬度要統(tǒng)一∏坠欤】
例1趋惨、將立即數(shù)存入到內(nèi)存中:
1、MOV BYTE PTR DS:[0x12FFC4],0x1
2惦蚊、MOV WORD PTR DS:[0x12FFC8],0x1
3器虾、MOV DWORD PTR DS:[0x12FFCC],0x1
【語(yǔ)法:MOV寬度(BYTE\WORD\ DWORD)PTR DS:[地址編號(hào)],立即數(shù)。BYTE表示寬度為一個(gè)字節(jié)蹦锋,WORD表示寬度為兩個(gè)字節(jié)兆沙,DWORD表示寬度為四個(gè)字節(jié),PTR指的是指針point晕粪,DS:段寄存器挤悉,[]里面寫(xiě)內(nèi)存編號(hào),表示已經(jīng)申請(qǐng)過(guò)的內(nèi)存巫湘。】
打開(kāi)DTDebug.exe將例1輸入到匯編窗口中昏鹃。如圖2-5-4所示尚氛。
按F8單步運(yùn)行,觀察堆棧窗口的變化洞渤,如圖2-5-5所示阅嘶。
[if !supportLists]例2、[endif]將寄存器中的數(shù)據(jù)存入到內(nèi)存中:
1载迄、MOV BYTE PTR DS:[0x12FFC4],AL
2讯柔、MOV WORD PTR DS:[0x12FFC8],CX
3、MOV DWORD PTR DS:[0x12FFCC],EDX
【語(yǔ)法:MOV寬度(BYTE\WORD\ DWORD)PTR DS:[地址編號(hào)],寄存器护昧』昶】
將例2輸入到匯編窗口中。如圖2-5-6所示惋耙。
按F8單步運(yùn)行捣炬,觀察堆棧窗口的變化熊昌,如圖2-5-7所示。
2.5.4【內(nèi)存和寄存器的區(qū)別】
寄存器:數(shù)量少湿酸,在CPU的內(nèi)部婿屹,速度極快,但是價(jià)格昂貴推溃;
內(nèi)存:數(shù)量龐大昂利,相對(duì)寄存器來(lái)說(shuō),速度慢很多铁坎,價(jià)格便宜蜂奸。
u下一節(jié)介紹內(nèi)存的五種形式。
練習(xí):
1厢呵、分別向內(nèi)存中存儲(chǔ)2個(gè)字節(jié)窝撵、2個(gè)字、2個(gè)雙字??內(nèi)存地址和內(nèi)容自己指定. ?
2襟铭、從內(nèi)存中讀取數(shù)據(jù)存儲(chǔ)到AL碌奉、AH、CX寒砖、DX赐劣、SP、EBX哩都、DI魁兼、ESI中,內(nèi)存地址自己指定.【思考一下怎么寫(xiě)】
3漠嵌、MOV WORD PTR DS:[0X0012FFC4],EAX ?對(duì)嗎咐汞?為什么?
MOV AH,BYTE PTR DS : [0x0024ffC6]可以這樣寫(xiě)嗎儒鹿?
4化撕、多練習(xí)MOV指令 。 ?
o