2022-12-04基礎(chǔ)知識

匯編語言是直接在硬件之上工作的編程語言,首先要了解硬件系統(tǒng)的結(jié)構(gòu),才能有效的應(yīng)用匯編語言對其編程。

機(jī)器語言

機(jī)器語言是機(jī)器指令的集合。

機(jī)器指令展開來講就是一臺機(jī)器可以正確執(zhí)行的命令。

匯編語言的產(chǎn)生

匯編語言的主體是匯編指令。

匯編指令和機(jī)器指令的差別在于指令的表示方法上。匯編指令是機(jī)器指令便于記憶的書寫格式。

匯編指令是機(jī)器指令的助記符。

機(jī)器指令: 1000100111011000

操作:寄存器BX的內(nèi)容送到AX中

寄存器:

簡單的講是CPU中可以存儲數(shù)據(jù)的器件,一個(gè)CPU中有多個(gè)寄存器。

AX是其中一個(gè)寄存器的代號,BX是另一個(gè)寄存器的代號。

計(jì)算機(jī)能讀懂的只有機(jī)器指令,那么如何讓計(jì)算機(jī)執(zhí)行程序員用匯編指令編寫的程序呢?

匯編語言的組成

匯編語言發(fā)展至今,有以下3類指令組成

匯編指令:機(jī)器碼的助記符,有對應(yīng)的機(jī)器碼。

偽指令:沒有對應(yīng)的機(jī)器碼,由編譯器執(zhí)行,計(jì)算機(jī)并不執(zhí)行。

其他符號: 如+、-、*、/ 等,由編譯器識別,沒有對應(yīng)的機(jī)器碼。

匯編語言的核心是匯編指令,它決定了匯編語言的特性。

存儲器

CPU是計(jì)算機(jī)的核心部件,它控制整個(gè)計(jì)算機(jī)的運(yùn)作并進(jìn)行運(yùn)算。要想讓一個(gè)CPU工作,就必須向它提供指令和數(shù)據(jù)。指令和數(shù)據(jù)在存儲器中存放,也就是我們平時(shí)所說的內(nèi)存。在一臺PC機(jī)中內(nèi)存的作用僅次于CPU。離開了內(nèi)存,性能再好的CPU也無法工作。磁盤不同于內(nèi)存,磁盤上的數(shù)據(jù)或程序如果不讀到內(nèi)存中,就無法被CPU使用。要靈活地利用匯編語言編程,我們首先要了解CPU是如何從內(nèi)存中讀取信息,以及向內(nèi)存中寫入信息的。

指令和數(shù)據(jù)

指令和數(shù)據(jù)是應(yīng)用上的概念。在內(nèi)存或磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息。CPU在工作的時(shí)候把有的信息看作指令,有的信息看作數(shù)據(jù),為同樣的信息賦予了不同的意義。就像圍棋的棋子,在棋盒里的時(shí)候沒有任何區(qū)別,在對弈的時(shí)候就有了不同的意義。

例如,內(nèi)存中的二進(jìn)制信息1001001011011000, 計(jì)算機(jī)可以把它看作大小為89D8H的數(shù)據(jù)來處理,也可以將其看作指令mov ax,bx來執(zhí)行。

1000100111011000-> 89D8H (數(shù)據(jù))

1000100111011000 -> mov ax,bx(程序)

存儲器被劃分成若干個(gè)存儲單元,每個(gè)存儲單元從0開始順序編號,例如一個(gè)存儲器有128個(gè)存儲單元,編號從0~127,如圖1.2所示。

那么一個(gè)存儲單元能存儲多少信息呢?我們知道電子計(jì)算機(jī)的最小信息單位是bit(音譯為比特),也就是一個(gè)二進(jìn)制位。8個(gè)bit組成一個(gè)Byte,也就是通常講的一個(gè)字節(jié)。微型機(jī)存儲器的存儲單元可以存儲一個(gè)Byte, 即8個(gè)二進(jìn)制位。一個(gè)存儲器有 128個(gè)存儲單元, 它可以存儲128個(gè)Byte。

微機(jī)存儲器的容量是以字節(jié)為最小單位來計(jì)算的。對于擁有128個(gè)存儲單元的存儲器,我們可以說,它的容量是128個(gè)字節(jié)。

對于大容量的存儲器般還用以 下單位來計(jì)量容量(以下用B來代表Byte):

磁盤的容量單位同內(nèi)存的一樣, 實(shí)際上以上單位是微機(jī)中常用的計(jì)量單位。

CPU對存儲期的讀寫

存儲器被劃分成多個(gè)存儲單元,存儲單元從零開始順序編號。這些編號可以看作存儲單元在存儲器中的地址。就像一 條街,每個(gè)房子都有門牌號碼。

CPU要從內(nèi)存中讀數(shù)據(jù),首先要指定存儲單元的地址。也就是說它要先確定它要讀取哪一個(gè)存儲單元中的數(shù)據(jù)。

另外,在一臺微機(jī)中,不只有存儲器這一種器件。 CPU在讀寫數(shù)據(jù)時(shí)還要指明,它要對哪一個(gè)器件進(jìn)行操作,進(jìn)行哪種操作,是從中讀出數(shù)據(jù),還是向里面寫入數(shù)據(jù)。

可見,CPU要想進(jìn)行數(shù)據(jù)的讀寫,必須和外部器件(標(biāo)準(zhǔn)的說法是芯片)進(jìn)行下面3類信息的交互。

存儲單元的地址(地址信息);

器件的選擇,讀或?qū)懙拿?控制信息);

讀或?qū)懙臄?shù)據(jù)(數(shù)據(jù)信息)。

CPU是通過什么將地址、數(shù)據(jù)和控制信息傳到存儲器芯片中的呢?電子計(jì)算機(jī)能處理、傳輸?shù)男畔⒍际请娦盘?,電信號?dāng)然要用導(dǎo)線傳送。在計(jì)算機(jī)中專門有連接CPU和其他芯片的導(dǎo)線,通常稱為總線??偩€從物理上來講,就是一根根導(dǎo)線的集合。根據(jù)傳送信息的不同,總線從邏輯上又分為3類,地址總線、控制總線和數(shù)據(jù)總線。

CPU從3號單元中讀取數(shù)據(jù)的過程(見圖1.3)如下。

CPU 通過地址線將地址信息3發(fā)出。

CPU 通過控制線發(fā)出內(nèi)存寫命令,選中存儲器芯片,并通知它,要向其中寫入數(shù)據(jù)。

CPU 通過數(shù)據(jù)線將數(shù)據(jù)26送入內(nèi)存的3號單元中。

從上面知道了CPU是如何進(jìn)行數(shù)據(jù)讀寫的??墒牵绾蚊钣?jì)算機(jī)進(jìn)行數(shù)據(jù)的讀寫呢?

要讓一個(gè)計(jì)算機(jī)或微處理器工作,應(yīng)向它輸入能夠驅(qū)動它進(jìn)行工作的電平信息(機(jī)器碼)。對于8086CPU,下面的機(jī)器碼, 能夠完成從3號單元讀數(shù)據(jù)。

機(jī)器碼:10100001 00000011 00000000

含義:從3號單元讀取數(shù)據(jù)送入寄存器AX

CPU接收這條機(jī)器碼后將完成我們上面所述的讀寫工作。

機(jī)器碼難于記憶,用匯編指令來表示,情況如下。

機(jī)器碼:101000010000001100000000

對應(yīng)的匯編指令: MOV AX,[3]

含義:傳送3號單元的內(nèi)容入AX

地址總線

CPU是通過地址總線來指定存儲器單元的??梢姷刂房偩€上能傳送多少個(gè)不同的信息,CPU就可以對多少個(gè)存儲單元進(jìn)行尋址。

現(xiàn)假設(shè),一個(gè)CPU有10根地址總線,讓我們來看一下它的尋址情況。我們知道,在電子計(jì)算機(jī)中,一根導(dǎo)線可以傳送的穩(wěn)定狀態(tài)只有兩種,高電平或是低電平。用二進(jìn)制表示就是1或0,10 根導(dǎo)線可以傳送10位:進(jìn)制數(shù)據(jù)。而10位二進(jìn)制數(shù)可以表示多少個(gè)不同的數(shù)據(jù)呢? 2的10次方個(gè)。最小數(shù)為0,最大數(shù)為1023。

圖1.4展示了一個(gè)具有10根地址線的CPU向內(nèi)存發(fā)出地址信息11時(shí)10根地址線上傳送的二進(jìn)制信息??紤]一下,訪問地址為12、13、 14 等的內(nèi)存單元時(shí),地址總線上傳送的內(nèi)容是什么?

一個(gè)CPU有N根地址線,則可以說這個(gè)CPU的地址總線的寬度為N.這樣的CPU最多可以尋找2的N次方個(gè)內(nèi)存單元。

16位數(shù)據(jù)總線上傳送的信息

8086有16根數(shù)據(jù)線,可一次傳送16 位數(shù)據(jù),所以可一次傳送數(shù)據(jù) 89D8H;而8088只有8根數(shù)據(jù)線,一次只能傳8位數(shù)據(jù),所以向內(nèi)存寫入數(shù)據(jù)89D8H時(shí)需要進(jìn)行兩次數(shù)據(jù)傳送。

控制總線

CPU對外部器件的控制是通過控制總線來進(jìn)行的。在這里控制總線是個(gè)總稱,控制總線是一些不同控制線的集合。有多少根控制總線,就意味著CPU提供了對外部器件的多少種控制。所以,控制總線的寬度決定了CPU對外部器件的控制能力。

前面所講的內(nèi)存讀或?qū)懨钍怯蓭赘刂凭€綜合發(fā)出的,其中有一根稱為 “讀信號輸出”的控制線負(fù)責(zé)由CPU向外傳送讀信號,CPU向該控制線上輸出低電平表示將要讀取數(shù)據(jù):有一根稱為“寫信號輸出”的控制線則負(fù)責(zé)傳送寫信號。

匯編指令是機(jī)器指令的助記符,同機(jī)器指令一一對應(yīng)。

每一種CPU都有自己的匯編指令集。

CPU可以直接使用的信息在存儲器中存放。

在存儲器中指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息。

存儲單元從零開始順序編號。

一個(gè)存儲單元可以存儲8個(gè)bit,即8位二進(jìn)制數(shù)。

1Byte= 8bit 1KB= 1024B 1MB = 1024KB 1GB = 1024MB。

每一個(gè)CPU芯片都有許多管腳,這些管腳和總線相連。也可以說, 這些管腳引出總線。一個(gè)CPU可以引出3種總線的寬度標(biāo)志了這個(gè)CPU的不同方面的性能:

地址總線的寬度決定了CPU的尋址能力:

數(shù)據(jù)總線的寬度決定了CPU與其他器件進(jìn)行數(shù)據(jù)傳送時(shí)的一次數(shù)據(jù)傳送量;

控制總線的寬度決定了CPU對系統(tǒng)中其他器件的控制能力。

內(nèi)存地址空間(概述)

什么是內(nèi)存地址空間呢?一個(gè)CPU的地址總線寬度為10, 那么可以尋址1024個(gè)內(nèi)存單元,這1024個(gè)可尋到的內(nèi)存單元就構(gòu)成這個(gè)CPU的內(nèi)存地址空間。下面進(jìn)行深入討論。首先需要介紹兩部分基本知識,主板和接口卡。

主板

在每一臺PC機(jī)中,都有一個(gè)主板,主板上有核心器件和一些主要器件,這些器件通過總線(地址總線、數(shù)據(jù)總線、控制總線)相連。這些器件有CPU、存儲器、外圍芯片組、擴(kuò)展插槽等。擴(kuò)展插槽上一般插有RAM內(nèi)存條和各類接口卡。

接口卡

計(jì)算機(jī)系統(tǒng)中,所有可用程序控制其工作的設(shè)備,必須受到CPU的控制。CPU對外部設(shè)備都不能直接控制,如顯示器、音箱、打印機(jī)等。直接控制這些設(shè)備進(jìn)行工作的是插在擴(kuò)展插槽上的接口卡。擴(kuò)展插槽通過總線和CPU相連,所以接口卡也通過總線同CPU相連。CPU可以直接控制這些接口卡,從而實(shí)現(xiàn)CPU對外設(shè)的間接控制。簡單地講,就是CPU通過總線向接口卡發(fā)送命令,接口卡根據(jù)CPU的命令控制外設(shè)進(jìn)行工作。

各類存儲器芯片

一臺PC機(jī)中,裝有多個(gè)存儲器芯片,這些存儲器芯片從物理連接上看是獨(dú)立的、不同的器件。從讀寫屬性上看分為兩類:隨機(jī)存儲器(RAM)和只讀存儲器(ROM)。隨機(jī)存儲器可讀可寫,但必須帶電存儲,關(guān)機(jī)后存儲的內(nèi)容丟失,只讀存儲器只能讀取不能寫入,關(guān)機(jī)后其中的內(nèi)容不丟失。這些存儲器從功能和連接上又可分為以下幾類。

隨機(jī)存儲器

用于存放供CPU使用的絕大部分程序和數(shù)據(jù),主隨機(jī)存儲器一般由兩個(gè)位置 上的RAM組成,裝在主板上RAM和插在擴(kuò)展插槽上的RAM。

裝有BIOS(Basic Input/Output System,基本輸入/輸出系統(tǒng))的ROM

BIOS是由主板和各類接口卡(如顯卡、網(wǎng)卡等)廠商提供的軟件系統(tǒng),可以通過它利用該硬件設(shè)備進(jìn)行最基本的輸入輸出。在主板和某些接口卡上插有存儲相應(yīng)BIOS的ROM。例如,主板上的ROM中存儲著主板的BIOS(通 常稱為系統(tǒng)BIOS);顯卡上的ROM中存儲著顯卡的BIOS; 如果網(wǎng)卡上裝有ROM,那其中就可以存儲網(wǎng)卡的BIOS。

接口卡上的RAM

某些接口卡需要對大批量輸入、輸出數(shù)據(jù)進(jìn)行暫時(shí)存儲,在其上裝有RAM。最典型的是顯示卡上的RAM,一般稱為顯存。顯示卡隨時(shí)將顯存中的數(shù)據(jù)向顯示器上輸出。換句話說,我們將需要顯示的內(nèi)容寫入顯存,就會出現(xiàn)在顯示器上。

圖展示了PC系統(tǒng)中各類存儲器的邏輯連接情況。

內(nèi)存地址空間

上述的那些存儲器,在物理上是獨(dú)立的器件,但是在以下兩點(diǎn)上相同。

都和CPU的總線相連。

CPU對它們進(jìn)行讀或?qū)懙臅r(shí)候都通過控制線發(fā)出內(nèi)存讀寫命令。

這也就是說,CPU在操控它們的時(shí)候,把它們都當(dāng)作內(nèi)存來對待,把它們總的看作一個(gè)由若干存儲單元組成的邏輯存儲器,這個(gè)邏輯存儲器就是我們所說的內(nèi)存地址空間。

圖展示了CPU將系統(tǒng)中各類存儲器看作一個(gè)邏輯存儲器的情況。

將各類存儲器看作一個(gè)邏輯存儲器

在圖中,所有的物理存儲器被看作一個(gè)由若干存儲單元組成的邏輯存儲器,每個(gè)物理存儲器在這個(gè)邏輯存儲器中占有一個(gè)地址段,即一段地址空間。CPU在這段地址空間中讀寫數(shù)據(jù),實(shí)際上就是在相對應(yīng)的物理存儲器中讀寫數(shù)據(jù)。

假設(shè),圖中的內(nèi)存地址空間的地址段分配如下。

地址0~7FFFH的32KB空間為主隨機(jī)存儲器的地址空間;

地址8000H~9FFFH的8KB空間為顯存地址空間;

地址A000H~FFFFH的24KB空間為各個(gè)ROM的地址空間。

這樣,CPU向內(nèi)存地址為1000H的內(nèi)存單元中寫入數(shù)據(jù),這個(gè)數(shù)據(jù)就被寫入主隨機(jī)存儲器中; CPU向內(nèi)存地址為8000H 的內(nèi)存單元中寫入數(shù)據(jù),這個(gè)數(shù)據(jù)就被寫入顯存中,然后會被顯卡輸出到顯示器上; CPU向內(nèi)存地址為C000H的內(nèi)存單元中寫入數(shù)據(jù)的操作是沒有結(jié)果的,C000H單元中的內(nèi)容不會被改變,C000H單元實(shí)際上就是ROM存儲器中的一個(gè)單元。

內(nèi)存地址空間的大小受CPU地址總線寬度的限制。8086CPU的地址總線寬度為20,可以傳送2的20次方個(gè)不同的地址信息(大小從0至2的20次方-1)。即可以定位2的20次方個(gè)內(nèi)存單元,則8086PC的內(nèi)存地址空間大小為1MB。同理,80386CPU 的地址總線寬度為32,則內(nèi)存地址空間最大為4GB。

在基于一個(gè)計(jì)算機(jī)硬件系統(tǒng)編程的時(shí)候,必須知道這個(gè)系統(tǒng)中的內(nèi)存地址空間分配情況。因?yàn)楫?dāng)我們想在某類存儲器中讀寫數(shù)據(jù)的時(shí)候,必須知道它的第一個(gè)單元的地址和最后一個(gè)單元的地址,才能保證讀寫操作是在預(yù)期的存儲器中進(jìn)行。比如,希望向顯示器輸出一段信息,那么必須將這段信息寫到顯存中,顯卡才能將它輸出到顯示器上。要向顯存中寫入數(shù)據(jù),必須知道顯存在內(nèi)存地址空間中的地址。

不同的計(jì)算機(jī)系統(tǒng)的內(nèi)存地址空間的分配情況是不同的,圖展示了8086PC 機(jī)內(nèi)存地址空間分配的基本情況。

圖告訴我們,從地址0~9FFFF的內(nèi)存單元中讀取數(shù)據(jù),實(shí)際上就是在讀取主隨機(jī)存儲器中的數(shù)據(jù);向地址A0000~BFFFF的內(nèi)存單元中寫數(shù)據(jù),就是向顯存中寫入數(shù)據(jù),這些數(shù)據(jù)會被顯示卡輸出到顯示器上;我們向地址C0000~FFFF的內(nèi)存單元中寫入數(shù)據(jù)的操作是無效的,因?yàn)檫@等于改寫只讀存儲器中的內(nèi)容。

內(nèi)存地址空間

最終運(yùn)行程序的是CPU,我們用匯編語言編程的時(shí)候,必須要從CPU的角度考慮問題。對CPU來講,系統(tǒng)中的所有存儲器中的存儲單元都處于一個(gè)統(tǒng)一的邏輯存儲 器中,它的容量受CPU尋址能力的限制。這個(gè)邏輯存儲器即是我們所說的內(nèi)存地址空間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容