【匯編基礎(chǔ)】1.基礎(chǔ)知識(shí)
1.1機(jī)器語(yǔ)言
說(shuō)到匯編語(yǔ)言的產(chǎn)生,首先要講一下機(jī)器語(yǔ)言。機(jī)器語(yǔ)言是機(jī)器指令的集合。機(jī)器指令展開(kāi)來(lái)講就是一臺(tái)機(jī)器可以正確執(zhí)行的命令。電子計(jì)算機(jī)的機(jī)器指令是一列二進(jìn)制數(shù)字。計(jì)算機(jī)將之轉(zhuǎn)變?yōu)橐涣懈叩碗娖剑允褂?jì)算機(jī)的電子器件受到驅(qū)動(dòng),進(jìn)行運(yùn)算。
上面所說(shuō)的計(jì)算機(jī)指的是可以執(zhí)行機(jī)器指令,進(jìn)行運(yùn)算的機(jī)器。這是早期計(jì)算機(jī)的概念。現(xiàn)在,在我們常用的PC機(jī)中,有一個(gè)芯片來(lái)完成上面所說(shuō)的計(jì)算機(jī)的功能。這個(gè)芯片就是我們常說(shuō)的CPU(Central Processing Unit,中央處理單元),CPU是一種微處理器。以后我們提到的計(jì)算機(jī)是指由CPU和其他受CPU直接或間接控制的芯片、器件、設(shè)備組成的計(jì)算機(jī)系統(tǒng),比如我們最常見(jiàn)的PC機(jī)。
每一種微處理器,由于硬件設(shè)計(jì)和內(nèi)部結(jié)構(gòu)的不同,就需要用不同的電平脈沖來(lái)控制,使它工作。所以每一種微處理器都有自己的機(jī)器指令集,也就是機(jī)器語(yǔ)言。
早期的程序設(shè)計(jì)均使用機(jī)器語(yǔ)言。程序員們將用0、1數(shù)字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過(guò)紙帶機(jī)或卡片機(jī)輸入計(jì)算機(jī),進(jìn)行運(yùn)算。
早期的程序設(shè)計(jì)均使用機(jī)器語(yǔ)言。程序員們將用0、1數(shù)字編成的程序代碼打在紙帶或卡片上,1打孔,0不打孔,再將程序通過(guò)紙帶機(jī)或卡片機(jī)輸入計(jì)算機(jī),進(jìn)行運(yùn)算。
應(yīng)用8086CPU完成運(yùn)算s=768+12288-1280,機(jī)器碼如下。
101110000000000000000011000001010000000000110000001011010000000000000101
假如將程序錯(cuò)寫(xiě)成以下這樣,請(qǐng)你找出錯(cuò)誤。
101100000000000000000011000001010000000000110000000101101000000000000101
書(shū)寫(xiě)和閱讀機(jī)器碼程序不是一件簡(jiǎn)單的工作,要記住所有抽象的二進(jìn)制碼。上面只是一個(gè)非常簡(jiǎn)單的小程序,就暴露了機(jī)器碼的晦澀難懂和不易查錯(cuò)。寫(xiě)如此小的一個(gè)程序尚且如此,實(shí)際上一個(gè)有用的程序至少要有幾十行機(jī)器碼,那么,情況將怎么樣呢?
在顯示器上輸出“welcome to masm”,機(jī)器碼如下。
00011110 101110000000000000000000 01010000 101110001100011000001111 1000111011011000 1011010000000110 1011000000000000 1011011100000111 101110010000000000000000 1011011000011000 1011001001001111 1100110100010000 1011010000000010 1011011100000000 1011011000000000 1011001000000000 1100110100010000 1011010000001001 10001101000101100010101000000000 1100110100100001 1011010000001010 10001101000101100011000100000000 1100110100100001 1011010000000110 1011000000010100 1011011100011001 1011010100001011 1011000100010011 1011011000001101 1011001000111100 1100110100010000 1011010000000010 1011011100000000 1011000000001100 1011001000010100 1100110100010000 1011010000001001 10001101000101100000000000000000 1100110100100001 11001011
看到這樣的程序,你有什么感想?如果程序里有一個(gè)“1”被誤寫(xiě)為“0”,又如何去查找呢?
1.2 匯編語(yǔ)言的產(chǎn)生
早期的程序員們很快就發(fā)現(xiàn)了使用機(jī)器語(yǔ)言帶來(lái)的麻煩,它是如此難于辨別和記憶,給整個(gè)產(chǎn)業(yè)的發(fā)展帶來(lái)了障礙。于是匯編語(yǔ)言產(chǎn)生了。
匯編語(yǔ)言的主體是匯編指令。匯編指令和機(jī)器指令的差別在于指令的表示方法上。匯編指令是機(jī)器指令便于記憶的書(shū)寫(xiě)格式。
例如:機(jī)器指令1000100111011000表示把寄存器BX的內(nèi)容送到AX中。匯編指令則寫(xiě)成mov ax,bx。這樣的寫(xiě)法與人類(lèi)語(yǔ)言接近,便于閱讀和記憶。
操作:寄存器BX的內(nèi)容送到AX中 機(jī)器指令:1000100111011000 匯編指令:mov ax,bx
(寄存器,簡(jiǎn)單地講是CPU中可以存儲(chǔ)數(shù)據(jù)的器件,一個(gè)CPU中有多個(gè)寄存器。AX是其中一個(gè)寄存器的代號(hào),BX是另一個(gè)寄存器的代號(hào)。更詳細(xì)的內(nèi)容我們?cè)谝院蟮恼n程中將會(huì)講到。)
此后,程序員們就用匯編指令編寫(xiě)源程序。可是,計(jì)算機(jī)能讀懂的只有機(jī)器指令,那么如何讓計(jì)算機(jī)執(zhí)行程序員用匯編指令編寫(xiě)的程序呢?這時(shí),就需要有一個(gè)能夠?qū)R編指令轉(zhuǎn)換成機(jī)器指令的翻譯程序,這樣的程序我們稱(chēng)其為編譯器。程序員用匯編語(yǔ)言寫(xiě)出源程序,再用匯編編譯器將其編譯為機(jī)器碼,由計(jì)算機(jī)最終執(zhí)行。圖1.1描述了這個(gè)工作過(guò)程。
1.3 匯編語(yǔ)言的組成
匯編語(yǔ)言發(fā)展至今,有以下3類(lèi)指令組成。
(1)匯編指令:機(jī)器碼的助記符,有對(duì)應(yīng)的機(jī)器碼。
(2)偽指令:沒(méi)有對(duì)應(yīng)的機(jī)器碼,由編譯器執(zhí)行,計(jì)算機(jī)并不執(zhí)行。
(3)其他符號(hào):如+、一、*、/ 等,由編譯器識(shí)別,沒(méi)有對(duì)應(yīng)的機(jī)器碼。
匯編語(yǔ)言的核心是匯編指令,它決定了匯編語(yǔ)言的特性。
1.4 存儲(chǔ)器
CPU是計(jì)算機(jī)的核心部件,它控制整個(gè)計(jì)算機(jī)的運(yùn)作并進(jìn)行運(yùn)算。要想讓一個(gè)CPU工作,就必須向它提供指令和數(shù)據(jù)。指令和數(shù)據(jù)在存儲(chǔ)器中存放,也就是我們平時(shí)所說(shuō)的內(nèi)存。在一臺(tái)PC機(jī)中內(nèi)存的作用僅次于CPU。離開(kāi)了內(nèi)存,性能再好的CPU也無(wú)法工作。這就像再聰明的大腦,沒(méi)有了記憶也無(wú)法進(jìn)行思考。磁盤(pán)不同于內(nèi)存,磁盤(pán)上的數(shù)據(jù)或程序如果不讀到內(nèi)存中,就無(wú)法被CPU使用。要靈活地利用匯編語(yǔ)言編程,我們首先要了解CPU是如何從內(nèi)存中讀取信息,以及向內(nèi)存中寫(xiě)入信息的。
1.5 指令和數(shù)據(jù)
指令和數(shù)據(jù)是應(yīng)用上的概念。在內(nèi)存或磁盤(pán)上,指令和數(shù)據(jù)沒(méi)有任何區(qū)別,都是二進(jìn)制信息。CPU在工作的時(shí)候把有的信息看作指令,有的信息看作數(shù)據(jù),為同樣的信息賦予了不同的意義。就像圍棋的棋子,在棋盒里的時(shí)候沒(méi)有任何區(qū)別,在對(duì)弈的時(shí)候就有了不同的意義。
1.6 存儲(chǔ)單元
存儲(chǔ)器被劃分成若干個(gè)存儲(chǔ)單元,每個(gè)存儲(chǔ)單元從0開(kāi)始順序編號(hào),例如一個(gè)存儲(chǔ)器有128個(gè)存儲(chǔ)單元,編號(hào)從0~127,如圖1.2所示。
那么一個(gè)存儲(chǔ)單元能存儲(chǔ)多少信息呢?我們知道電子計(jì)算機(jī)的最小信息單位是bit(音譯為比特),也就是一個(gè)二進(jìn)制位。8個(gè)bit組成一個(gè)Byte,也就是通常講的一個(gè)字節(jié)。微型機(jī)存儲(chǔ)器的存儲(chǔ)單元可以存儲(chǔ)一個(gè)Byte,即8個(gè)二進(jìn)制位。一個(gè)存儲(chǔ)器有128個(gè)存儲(chǔ)單元,它可以存儲(chǔ)128個(gè)Byte。
微機(jī)存儲(chǔ)器的容量是以字節(jié)為最小單位來(lái)計(jì)算的。對(duì)于擁有128個(gè)存儲(chǔ)單元的存儲(chǔ)器,我們可以說(shuō),它的容量是128個(gè)字節(jié)。
對(duì)于大容量的存儲(chǔ)器一般還用以下單位來(lái)計(jì)量容量(以下用B來(lái)代表Byte):
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
磁盤(pán)的容量單位同內(nèi)存的一樣,實(shí)際上以上單位是微機(jī)中常用的計(jì)量單位。
1.7 CPU對(duì)存儲(chǔ)器的讀寫(xiě)
以上講到,存儲(chǔ)器被劃分成多個(gè)存儲(chǔ)單元,存儲(chǔ)單元從零開(kāi)始順序編號(hào)。這些編號(hào)可以看作存儲(chǔ)單元在存儲(chǔ)器中的地址。就像一條街,每個(gè)房子都有門(mén)牌號(hào)碼。
CPU要從內(nèi)存中讀數(shù)據(jù),首先要指定存儲(chǔ)單元的地址。也就是說(shuō)它要先確定它要讀取哪一個(gè)存儲(chǔ)單元中的數(shù)據(jù)。就像在一條街上找人,先要確定他住在哪個(gè)房子里。
另外,在一臺(tái)微機(jī)中,不只有存儲(chǔ)器這一種器件。CPU在讀寫(xiě)數(shù)據(jù)時(shí)還要指明,它要對(duì)哪一個(gè)器件進(jìn)行操作,進(jìn)行哪種操作,是從中讀出數(shù)據(jù),還是向里面寫(xiě)入數(shù)據(jù)。
可見(jiàn),CPU要想進(jìn)行數(shù)據(jù)的讀寫(xiě),必須和外部器件(標(biāo)準(zhǔn)的說(shuō)法是芯片)進(jìn)行下面3類(lèi)信息的交互。
- 存儲(chǔ)單元的地址(地址信息)
- 器件的選擇,讀或?qū)懙拿睿刂菩畔ⅲ?/li>
- 讀或?qū)懙臄?shù)據(jù)(數(shù)據(jù)信息)
那么CPU是通過(guò)什么將地址、數(shù)據(jù)和控制信息傳到存儲(chǔ)器芯片中的呢?電子計(jì)算機(jī)能處理、傳輸?shù)男畔⒍际请娦盘?hào),電信號(hào)當(dāng)然要用導(dǎo)線(xiàn)傳送。在計(jì)算機(jī)中專(zhuān)門(mén)有連接CPU和其他芯片的導(dǎo)線(xiàn),通常稱(chēng)為總線(xiàn)。總線(xiàn)從物理上來(lái)講,就是一根根導(dǎo)線(xiàn)的集合。
根據(jù)傳送信息的不同,總線(xiàn)從邏輯上又分為3類(lèi),地址總線(xiàn)、控制總線(xiàn)和數(shù)據(jù)總線(xiàn)。
CPU從3號(hào)單元中讀取數(shù)據(jù)的過(guò)程(見(jiàn)圖1.3)如下。
(1)CPU通過(guò)地址線(xiàn)將地址信息3發(fā)出。
(2)CPU通過(guò)控制線(xiàn)發(fā)出內(nèi)存讀命令,選中存儲(chǔ)器芯片,并通知它,將要從中讀取數(shù)據(jù)。
(3)存儲(chǔ)器將3號(hào)單元中的數(shù)據(jù)8通過(guò)數(shù)據(jù)線(xiàn)送入CPU。
寫(xiě)操作與讀操作的步驟相似。如向3號(hào)單元寫(xiě)入數(shù)據(jù)26。
(1)CPU通過(guò)地址線(xiàn)將地址信息3發(fā)出。
(2)CPU通過(guò)控制線(xiàn)發(fā)出內(nèi)存寫(xiě)命令,選中存儲(chǔ)器芯片,并通知它,要向其中寫(xiě)入數(shù)據(jù)。
(3)CPU通過(guò)數(shù)據(jù)線(xiàn)將數(shù)據(jù)26送入內(nèi)存的3號(hào)單元中。
從上面我們知道了CPU是如何進(jìn)行數(shù)據(jù)讀寫(xiě)的。可是,如何命令計(jì)算機(jī)進(jìn)行數(shù)據(jù)的讀寫(xiě)呢?
要讓一個(gè)計(jì)算機(jī)或微處理器工作,應(yīng)向它輸入能夠驅(qū)動(dòng)它進(jìn)行工作的電平信息(機(jī)器碼)。
對(duì)于8086CPU,下面的機(jī)器碼,能夠完成從3號(hào)單元讀數(shù)據(jù)。
機(jī)器碼:101000010000001100000000 含義:從3號(hào)單元讀取數(shù)據(jù)送入寄存器AX
CPU接收這條機(jī)器碼后將完成我們上面所述的讀寫(xiě)工作。
機(jī)器碼難于記憶,用匯編指令來(lái)表示,情況如下。
機(jī)器碼:101000010000001100000000 對(duì)應(yīng)的匯編指令:MOV AX,[3] 含義:傳送3號(hào)單元的內(nèi)容入AX
1.8 地址總線(xiàn)
現(xiàn)在我們知道,CPU是通過(guò)地址總線(xiàn)來(lái)指定存儲(chǔ)器單元的。可見(jiàn)地址總線(xiàn)上能傳送多少個(gè)不同的信息,CPU就可以對(duì)多少個(gè)存儲(chǔ)單元進(jìn)行尋址。
現(xiàn)假設(shè),一個(gè)CPU有10根地址總線(xiàn),讓我們來(lái)看一下它的尋址情況。我們知道,在電子計(jì)算機(jī)中,一根導(dǎo)線(xiàn)可以傳送的穩(wěn)定狀態(tài)只有兩種,高電平或是低電平。用二進(jìn)制表示就是1或0,10根導(dǎo)線(xiàn)可以傳送10位二進(jìn)制數(shù)據(jù)。而10位二進(jìn)制數(shù)可以表示多少個(gè)不同的數(shù)據(jù)呢?2的10次方個(gè)。最小數(shù)為0,最大數(shù)為1023。
圖1.4展示了一個(gè)具有10根地址線(xiàn)的CPU向內(nèi)存發(fā)出地址信息11時(shí)10根地址線(xiàn)上傳送的二進(jìn)制信息。考慮一下,訪(fǎng)問(wèn)地址為12、13、14等的內(nèi)存單元時(shí),地址總線(xiàn)上傳送的內(nèi)容是什么?
一個(gè)CPU有N根地址線(xiàn),則可以說(shuō)這個(gè)CPU的地址總線(xiàn)的寬度為N。這樣的CPU最多可以尋找2的N次方個(gè)內(nèi)存單元。
1.9 數(shù)據(jù)總線(xiàn)
CPU與內(nèi)存或其他器件之間的數(shù)據(jù)傳送是通過(guò)數(shù)據(jù)總線(xiàn)來(lái)進(jìn)行的。數(shù)據(jù)總線(xiàn)的寬度決定了CPU和外界的數(shù)據(jù)傳送速度。8根數(shù)據(jù)總線(xiàn)一次可傳送一個(gè)8位二進(jìn)制數(shù)據(jù)(即一個(gè)字節(jié))。16根數(shù)據(jù)總線(xiàn)一次可傳送兩個(gè)字節(jié)。
8088CPU的數(shù)據(jù)總線(xiàn)寬度為8,8086CPU的數(shù)據(jù)總線(xiàn)寬度為16。我們來(lái)分別看一下它們向內(nèi)存中寫(xiě)入數(shù)據(jù)89D8H時(shí),是如何通過(guò)數(shù)據(jù)總線(xiàn)傳送數(shù)據(jù)的。圖1.5展示了8088CPU數(shù)據(jù)總線(xiàn)上的數(shù)據(jù)傳送情況;圖1.6展示了8086CPU數(shù)據(jù)總線(xiàn)上的數(shù)據(jù)傳送情況。
8088CPU分兩次傳送89D8,第一次傳送D8,第二次傳送89。
8086有16根數(shù)據(jù)線(xiàn),可一次傳送16位數(shù)據(jù),所以可一次傳送數(shù)據(jù)89D8H;而8088只有8根數(shù)據(jù)線(xiàn),一次只能傳8位數(shù)據(jù),所以向內(nèi)存寫(xiě)入數(shù)據(jù)89D8H時(shí)需要進(jìn)行兩次數(shù)據(jù)傳送。
1.10 控制總線(xiàn)
CPU對(duì)外部器件的控制是通過(guò)控制總線(xiàn)來(lái)進(jìn)行的。在這里控制總線(xiàn)是個(gè)總稱(chēng),控制總線(xiàn)是一些不同控制線(xiàn)的集合。有多少根控制總線(xiàn),就意味著CPU提供了對(duì)外部器件的多少種控制。所以,控制總線(xiàn)的寬度決定了CPU對(duì)外部器件的控制能力。
前面所講的內(nèi)存讀或?qū)懨钍怯蓭赘刂凭€(xiàn)綜合發(fā)出的,其中有一根稱(chēng)為“讀信號(hào)輸出”的控制線(xiàn)負(fù)責(zé)由CPU向外傳送讀信號(hào),CPU向該控制線(xiàn)上輸出低電平表示將要讀取數(shù)據(jù);有一根稱(chēng)為“寫(xiě)信號(hào)輸出”的控制線(xiàn)則負(fù)責(zé)傳送寫(xiě)信號(hào)。
1.11 內(nèi)存地址空間(概述)
什么是內(nèi)存地址空間呢?舉例來(lái)講,一個(gè)CPU的地址總線(xiàn)寬度為10,那么可以尋址1024個(gè)內(nèi)存單元,這1024個(gè)可尋到的內(nèi)存單元就構(gòu)成這個(gè)CPU的內(nèi)存地址空間。下面進(jìn)行深入討論。首先需要介紹兩部分基本知識(shí),主板和接口卡。
1.12 主板
在每一臺(tái)PC機(jī)中,都有一個(gè)主板,主板上有核心器件和一些主要器件,這些器件通過(guò)總線(xiàn)(地址總線(xiàn)、數(shù)據(jù)總線(xiàn)、控制總線(xiàn))相連。這些器件有CPU、存儲(chǔ)器、外圍芯片組、擴(kuò)展插槽等。擴(kuò)展插槽上一般插有RAM內(nèi)存條和各類(lèi)接口卡。
1.13 接口卡
計(jì)算機(jī)系統(tǒng)中,所有可用程序控制其工作的設(shè)備,必須受到CPU的控制。CPU對(duì)外部設(shè)備都不能直接控制,如顯示器、音箱、打印機(jī)等。直接控制這些設(shè)備進(jìn)行工作的是插在擴(kuò)展插槽上的接口卡。擴(kuò)展插槽通過(guò)總線(xiàn)和CPU相連,所以接口卡也通過(guò)總線(xiàn)同CPU相連。CPU可以直接控制這些接口卡,從而實(shí)現(xiàn)CPU對(duì)外設(shè)的間接控制。簡(jiǎn)單地講,就是CPU通過(guò)總線(xiàn)向接口卡發(fā)送命令,接口卡根據(jù)CPU的命令控制外設(shè)進(jìn)行工作。
1.14 各類(lèi)存儲(chǔ)器芯片
一臺(tái)PC機(jī)中,裝有多個(gè)存儲(chǔ)器芯片,這些存儲(chǔ)器芯片從物理連接上看是獨(dú)立的、不同的器件。從讀寫(xiě)屬性上看分為兩類(lèi):隨機(jī)存儲(chǔ)器(RAM)和只讀存儲(chǔ)器(ROM)。隨機(jī)存儲(chǔ)器可讀可寫(xiě),但必須帶電存儲(chǔ),關(guān)機(jī)后存儲(chǔ)的內(nèi)容丟失;只讀存儲(chǔ)器只能讀取不能寫(xiě)入,關(guān)機(jī)后其中的內(nèi)容不丟失。這些存儲(chǔ)器從功能和連接上又可分為以下幾類(lèi)。
- 隨機(jī)存儲(chǔ)器。用于存放供CPU使用的絕大部分程序和數(shù)據(jù),主隨機(jī)存儲(chǔ)器一般由兩個(gè)位置上的RAM組成,裝在主板上RAM和插在擴(kuò)展插槽上的RAM。
- 裝有BIOS(Basic Input/Output System,基本輸入/輸出系統(tǒng))的ROM BIOS是由主板和各類(lèi)接口卡(如顯卡、網(wǎng)卡等)廠(chǎng)商提供的軟件系統(tǒng),可以通過(guò)它利用該硬件設(shè)備進(jìn)行最基本的輸入輸出。在主板和某些接口卡上插有存儲(chǔ)相應(yīng)BIOS的ROM。例如,主板上的ROM中存儲(chǔ)著主板的BIOS(通常稱(chēng)為系統(tǒng)BIOS):顯卡上的ROM中存儲(chǔ)著顯卡的BIOS;如果網(wǎng)卡上裝有ROM,那其中就可以存儲(chǔ)網(wǎng)卡的 BIOS。
- 接口卡上的RAM某些接口卡需要對(duì)大批量輸入、輸出數(shù)據(jù)進(jìn)行暫時(shí)存儲(chǔ),在其上裝有RAM。最典型的是顯示卡上的RAM,一般稱(chēng)為顯存。顯示卡隨時(shí)將顯存中的數(shù)據(jù)向顯示器上輸出。換句話(huà)說(shuō),我們將需要顯示的內(nèi)容寫(xiě)入顯存,就會(huì)出現(xiàn)在顯示器上。
1.15 內(nèi)存地址空間
上述的那些存儲(chǔ)器,在物理上是獨(dú)立的器件,但是在以下兩點(diǎn)上相同。
- 都和CPU的總線(xiàn)相連。
- CPU對(duì)它們進(jìn)行讀或?qū)懙臅r(shí)候都通過(guò)控制線(xiàn)發(fā)出內(nèi)存讀寫(xiě)命令。
這也就是說(shuō),CPU在操控它們的時(shí)候,把它們都當(dāng)作內(nèi)存來(lái)對(duì)待,把它們總的看作一個(gè)由若干存儲(chǔ)單元組成的邏輯存儲(chǔ)器,這個(gè)邏輯存儲(chǔ)器就是我們所說(shuō)的內(nèi)存地址空間。
在匯編這門(mén)課中,我們所面對(duì)的是內(nèi)存地址空間。
在圖中,所有的物理存儲(chǔ)器被看作一個(gè)由若干存儲(chǔ)單元組成的邏輯存儲(chǔ)器,每個(gè)物理存儲(chǔ)器在這個(gè)邏輯存儲(chǔ)器中占有一個(gè)地址段,即一段地址空間。CPU在這段地址空間中讀寫(xiě)數(shù)據(jù),實(shí)際上就是在相對(duì)應(yīng)的物理存儲(chǔ)器中讀寫(xiě)數(shù)據(jù)。
假設(shè),圖中的內(nèi)存地址空間的地址段分配如下。
地址0~7FFFH的32KB空間為主隨機(jī)存儲(chǔ)器的地址空間:
地址8000H-9FFFH的8KB空間為顯存地址空間:
地址A000H-FFFFH的24KB空間為各個(gè)ROM的地址空間。
這樣,CPU向內(nèi)存地址為1000H的內(nèi)存單元中寫(xiě)入數(shù)據(jù),這個(gè)數(shù)據(jù)就被寫(xiě)入主隨機(jī)存儲(chǔ)器中;CPU向內(nèi)存地址為8000H的內(nèi)存單元中寫(xiě)入數(shù)據(jù),這個(gè)數(shù)據(jù)就被寫(xiě)入顯存中,然后會(huì)被顯卡輸出到顯示器上;CPU向內(nèi)存地址為C000H的內(nèi)存單元中寫(xiě)入數(shù)據(jù)的操作是沒(méi)有結(jié)果的,C000H單元中的內(nèi)容不會(huì)被改變,C000H單元實(shí)際上就是ROM存儲(chǔ)器中的一個(gè)單元。
內(nèi)存地址空間的大小受CPU地址總線(xiàn)寬度的限制。8086CPU的地址總線(xiàn)寬度為20,可以傳送220個(gè)不同的地址信息(大小從0至220-1)。即可以定位220個(gè)內(nèi)存單元,則8086PC的內(nèi)存地址空間大小為lMB。同理,80386CPU的地址總線(xiàn)寬度為32,則內(nèi)存地址空間最大為4GB。
我們?cè)诨谝粋€(gè)計(jì)算機(jī)硬件系統(tǒng)編程的時(shí)候,必須知道這個(gè)系統(tǒng)中的內(nèi)存地址空間分配情況。因?yàn)楫?dāng)我們想在某類(lèi)存儲(chǔ)器中讀寫(xiě)數(shù)據(jù)的時(shí)候,必須知道它的第一個(gè)單元的地址和最后一個(gè)單元的地址,才能保證讀寫(xiě)操作是在預(yù)期的存儲(chǔ)器中進(jìn)行。比如,我們希望向顯示器輸出一段信息,那么必須將這段信息寫(xiě)到顯存中,顯卡才能將它輸出到顯示器上。要向顯存中寫(xiě)入數(shù)據(jù),必須知道顯存在內(nèi)存地址空間中的地址。
不同的計(jì)算機(jī)系統(tǒng)的內(nèi)存地址空間的分配情況是不同的,下圖展示了8086PC機(jī)內(nèi)存地址空間分配的基本情況。
上圖告訴我們,從地址0-9FFFF的內(nèi)存單元中讀取數(shù)據(jù),實(shí)際上就是在讀取主隨機(jī)存儲(chǔ)器中的數(shù)據(jù);向地址A0000-BFFFF的內(nèi)存單元中寫(xiě)數(shù)據(jù),就是向顯存中寫(xiě)入數(shù)據(jù),這些數(shù)據(jù)會(huì)被顯示卡輸出到顯示器上;我們向地址C0000-FFFFF的內(nèi)存單元中寫(xiě)入數(shù)據(jù)的操作是無(wú)效的,因?yàn)檫@等于改寫(xiě)只讀存儲(chǔ)器中的內(nèi)容。
內(nèi)存地址空間
最終運(yùn)行程序的是CPU,我們用匯編語(yǔ)言編程的時(shí)候,必須要從CPU的角度考慮問(wèn)題。對(duì)CPU來(lái)講,系統(tǒng)中的所有存儲(chǔ)器中的存儲(chǔ)單元都處于一個(gè)統(tǒng)一的邏輯存儲(chǔ)器中,它的容量受CPU尋址能力的限制。這個(gè)邏輯存儲(chǔ)器即是我們所說(shuō)的內(nèi)存地址空間。