2.1 綜述
這部分內(nèi)容主要是一些計算機硬件的概念洽洁,如果你有計算機基礎(chǔ)可以不看痘系。當(dāng)然,也可以作為學(xué)習(xí)匯編的熱身運動饿自,畢竟有好多東西我們平常不使用總會忘記或者忽略汰翠。
2.2 機器語言
機器語言是機器指令集合。機器指令展開來講就是一臺機器可以正確執(zhí)行的命令昭雌。電子計算機的機器指令是一列二進制數(shù)字复唤。計算機將之轉(zhuǎn)變?yōu)橐涣懈叩碗娖剑允褂嬎銠C的電子器件受到驅(qū)動烛卧,進行計算佛纫。
現(xiàn)在,我們常用的PC機中总放,有一個芯片來完成上面所說的計算機的功能呈宇。這個芯片就是我們常說的CPU,CPU是一種微處理器局雄。
機器語言是 0 1 代碼甥啄,難于辨別和記憶!
2.3 匯編語言的產(chǎn)生
機器指令的可讀性和維護性對人來說炬搭,太難了蜈漓,匯編語言應(yīng)運而生。
匯編語言的主體是匯編指令宫盔。匯編指令和機器指令的區(qū)別在于表示方法上融虽。
例如:
1000100111011000
上面的指令表示把寄存器BX的內(nèi)容送到AX中。匯編指令改寫成:
mov ax,bx
這樣的寫法與人類語言相近灼芭,便于閱讀和記憶衣形。
什么是寄存器?
簡單的講是 CPU 中可以存儲數(shù)據(jù)的器件姿鸿,一個CPU中有多個寄存器谆吴。AX是其中一個寄存器的代號,BX是另一個寄存器的代號苛预。
有了匯編語言我們就可以直接用匯編指令編寫源程序句狼。可是腻菇,計算機能讀懂的只有機器執(zhí)行胳螟,那么我們就需要一個能將匯編指令轉(zhuǎn)換為機器指令的翻譯程序筹吐,這樣的程序我們稱之為:編譯器糖耸。
我們通過匯編語言寫出源程序,然后再用編譯器將其編譯成機器碼(機器指令)嘉竟,由計算機最終執(zhí)行洋侨。圖 2-1描述了整個過程希坚。
2.4 匯編語言的組成
三類指令:
- 匯編指令:機器碼的助記符聊疲,有對應(yīng)的機器碼茬底;
- 偽指令:沒有對應(yīng)的機器碼,由編譯器執(zhí)行售睹,計算機并不執(zhí)行;
- 其他符號:如+可训、-昌妹、*、/ 等握截,由編譯器識別飞崖,沒有對應(yīng)的機器碼。
核心是匯編指令谨胞,它決定了匯編語言的特性固歪。
2.5 存儲器
CPU 是計算機核心部件,它控制整個計算機的運作并進行計算胯努。要想讓一個CPU工作牢裳,就必須向它提供指令和數(shù)據(jù)。內(nèi)存叶沛,存放著這些指令和數(shù)據(jù)蒲讯。要靈活的利用匯編程序,我們首先要了解CPU是如何從內(nèi)存中讀取信息灰署,以及向內(nèi)存中寫入信息的判帮。
2.6 指令和數(shù)據(jù)
指令和數(shù)據(jù)的區(qū)分是在應(yīng)用上的概念局嘁。在內(nèi)存或者磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別看晦墙,都是二進制信息悦昵。CPU在工作的時候會把有的信息看做指令,有的信息看做數(shù)據(jù)晌畅,為同樣的信息賦予了不同的意義但指。就如同:
二進制信息: 1000 1001 1101 1000,計算機可以把它看做 89D8H 的數(shù)據(jù)來處理踩麦,也可以看做 mov ax,bx 來執(zhí)行枚赡。
2.7 存儲單元
存儲器別劃分為若干個存儲單元,每個存儲單元從 0 開始順序編號谓谦,例如一個存儲器有 128 個存儲單元贫橙,編號從 0 ~ 127 , 如圖 2-2反粥。
那么一個存儲單元能存儲的信息是多少卢肃?
計算機最小信息單位是 bit, 8 個 bit 構(gòu)成一個 Byte才顿,即 8 個二進制位莫湘。微型計算機的存儲單元可以存儲一個 Byte。一個存儲器有 128 個存儲單元的郑气,那么可存儲 128 個Byte幅垮。
2.8 CPU 對存儲器的讀寫
CPU 對存儲器的讀寫涉及三個方面:
- 地址信息,存儲單元的地址尾组;
- 控制信息忙芒,器件的選擇,因為在計算機中不僅僅只有存儲器這一個器件讳侨,以及讀/寫操作的選擇
- 數(shù)據(jù)信息呵萨,需要讀/寫的數(shù)據(jù)
計算機中能處理、傳輸?shù)男畔⒍际请娦盘柨缈纾娦盘柕膫鬏斖ㄟ^導(dǎo)線實現(xiàn)潮峦。所以,要完成上面的操作勇婴,必須有專門的導(dǎo)線連接忱嘹,所有的導(dǎo)線在計算機中稱之為: 總線。
根據(jù)導(dǎo)線上傳輸?shù)男畔⒌牟煌剩瑢?dǎo)線分為:
- 地址總線
- 控制總線
- 數(shù)據(jù)總線
CPU 從 3 號內(nèi)存單元中讀取數(shù)據(jù)的過程 如圖 2-3 所示:
- CPU 通過地址總線將地址信息 3 發(fā)出德谅;
- CPU 通過控制總線發(fā)出內(nèi)存讀取命令,選中存儲器芯片萨螺,并通知它窄做,將要從中讀取數(shù)據(jù)
- 存儲器 3 號單元中的數(shù)據(jù) 8 通過數(shù)據(jù)總線送入 CPU愧驱。
同樣,寫操作和讀取操作類似椭盏。如果向 3 好單元寫入數(shù)據(jù)组砚,其步驟如下:
- CPU 通過地址總線將地址信息 3 發(fā)出;
- CPU 通過控制總線發(fā)出內(nèi)存寫命令掏颊,并選中存儲芯片糟红,通知他要進行寫操作
- CPU 通過數(shù)據(jù)線將數(shù)據(jù) 26 送入到內(nèi)存存儲的 3 號單元中
我們已經(jīng)知道了 CPU 是如何進行數(shù)據(jù)讀寫操作的,那么乌叶,如何命令計算機進行數(shù)據(jù)的讀寫呢盆偿?
要想讓計算機工作,應(yīng)向其處理器輸入能夠驅(qū)動它進行工作的電平信息(機器碼)
對于 8086CPU 下面的機器碼准浴,能夠完成從 3 號 單元讀取數(shù)據(jù)操作
機器碼: 10100001000000110000000
解釋: 從 3 號存儲單元讀取數(shù)據(jù)并送入到寄存器 AX 中
CPU接收到這條機器碼后將完成我們上面所述的讀寫操作
機器碼難于記憶事扭,通過匯編指令表示,情況如下:
機器碼: 10100001 00000011 000000000
對應(yīng)的匯編指令: MOV AX , [3 ]
解釋: 傳送 3 號 單元的內(nèi)容如 AX
2.9 地址總線
現(xiàn)在乐横,我們知道CPU 通過地址總線來指定要訪問的存儲單元求橄。可見地址總線上能傳送多少個不同的信息葡公,CPU就能對多少個存儲單元進行尋址罐农。
現(xiàn)假設(shè),一個 CPU 有 10 根地址總線催什,讓我們來看一下它的尋址情況涵亏。我們知道,在計算機中蒲凶,一根導(dǎo)線可以傳送的穩(wěn)定狀態(tài)只有兩種气筋,高電平和低電平。用二進制表示就是 1 或者 0豹爹, 10 根導(dǎo)線可以傳送 10 位 二進制數(shù)據(jù)裆悄。而 10 位二進制數(shù)可以表示多少個不同的數(shù)據(jù)呢矛纹? 2^10 = 1024, 也就是可以表示 1024 個不同的數(shù)據(jù)臂聋,最小是 0,最大是 1023或南。
圖 2-4 展示了一個具有 10 根地址線的CPU向內(nèi)存發(fā)送地址信息 11 時候孩等, 10 根地址線上傳送的二進制信息。如果訪問地址12 采够、 13 肄方、 14 等內(nèi)存單元,地址線上傳輸?shù)膬?nèi)容又是多少呢蹬癌?
一個CPU有 N 根地址線权她,則可以說這個額CPU 的地址總線寬度為 N虹茶。
這樣 CPU最多可以尋找 2 ^ N 個內(nèi)存單元。
2.10 數(shù)據(jù)總線
CPU 與 內(nèi)存或者其他器件之間的數(shù)據(jù)傳送是通過數(shù)據(jù)總線來進行的隅要。數(shù)據(jù)總線的寬度決定了CPU和外界的數(shù)據(jù)傳送的速度蝴罪。 8 根數(shù)據(jù)總線一次可傳送 8 位二進制數(shù)(也就是一個字節(jié))。 同理步清,16根數(shù)據(jù)總線可以傳送兩個字節(jié)要门。
8088CPU 的數(shù)據(jù)總線寬度為 8, 8086CPU 的數(shù)據(jù)總線寬度為 16廓啊。我們分別看下它們向內(nèi)存中寫入數(shù)據(jù) 89D8H時欢搜,是如何通過數(shù)據(jù)總線傳送數(shù)據(jù)的。
如圖 2-5 所示谴轮,8088CPU數(shù)據(jù)總線上的數(shù)據(jù)傳送情況:
如圖 2-6 所示炒瘟, 8086CPU數(shù)據(jù)總線數(shù)據(jù)傳輸情況:
8086CPU 有 16 根數(shù)據(jù)線,可以一次傳送 16 位數(shù)據(jù)书聚,所以可一次傳送數(shù)據(jù) 89D8H唧领;
而 8088CPU 只有 8 根數(shù)據(jù)線,一次只能傳送 8 位數(shù)據(jù)雌续,所以向內(nèi)存寫入數(shù)據(jù) 89D8H時需要進行兩次數(shù)據(jù)傳送斩个。
2.11 控制總線
CPU 對外部器件的控制是通過控制總線進行的。在這里控制總線是個總稱驯杜,控制總線是一些不同控制線的結(jié)合受啥。有多少根控制總線,就意味著 CPU 提供了對外部器件的多少種控制鸽心。所以滚局,控制總線的寬度決定了 CPU 對外部器件的控制能力。
2.12 總結(jié):
- 匯編指令是機器指令的助記符顽频,通機器指令一一對應(yīng)藤肢;
- 每一種 CPU 都有自己的匯編指令集;
- CPU 可直接使用的信息存儲在存儲器中糯景;
- 在存儲器中指令和數(shù)據(jù)沒有區(qū)別嘁圈,都是二進制信息;
- 存儲單元從 0 開始編號蟀淮;
- 一個存儲單元可以存儲 8 個bit最住;
- 1 Byte = 8 bit, 1 KB = 1024 B 1 MB = 1024KB 1GB = 1024MB
- 每個CPU芯片都有許多銀角怠惶,這些銀角和總線相連涨缚。也可以說,這些銀角引出總線策治。一個 CPU 可以引出 3 中總線寬度標(biāo)志了這個CPU的不同方面的性能:
- 地址總線的寬度決定了CPU的尋址能力
- 數(shù)據(jù)總線的寬度決定了CPU與其他器件進行數(shù)據(jù)傳送時一次數(shù)據(jù)傳送量
- 控制總線的寬度決定了CPU對系統(tǒng)中其他器件的控制能力
2.13 主板
在每一臺 PC 機中脓魏,都有一個主板兰吟,主板上有核心器件和一些主要器件,這些器件通過總線相連茂翔。這些器件有CPU揽祥、存儲器、外圍芯片組檩电、擴展插槽拄丰。擴展插槽上一般有 RAM 內(nèi)存條和各類接口卡。
2.14 接口卡
計算機系統(tǒng)中俐末,所有可用程序控制其工作的設(shè)備必須受到 CPU 的控制料按。 CPU 對外部設(shè)備都不能直接控制,CPU對外部設(shè)備不能直接控制卓箫,如顯示器载矿、音響、打印機等烹卒。直接控制這些外部設(shè)備進行工作的是插在擴展插槽上的接口卡闷盔。擴展插槽通過總線和CPU相連,所以接口卡也通過總線和CPU相連旅急。CPU可以直接控制這些接口卡逢勾,從而實現(xiàn) CPU 對外設(shè)的間接控制。簡單地講藐吮,就是CPU通過總線向接口卡發(fā)送命令溺拱,接口卡根據(jù)CPU的命令控制外設(shè)進行工作。接口卡作為了CPU控制外設(shè)的一個媒介谣辞。
2.15 各類存儲器芯片
一臺PC機中迫摔,裝有多個存儲芯片,這些存儲芯片從物理連接上看是獨立的泥从、不同的器件句占。從讀寫屬性上看分為兩類:隨機存儲器(RAM)和只讀存儲器(ROM)。隨機存儲器可讀可寫躯嫉,但必須帶電存儲纱烘,關(guān)機后存儲的內(nèi)容丟失;只讀存儲器只能讀取不能寫入和敬,關(guān)機后其中的內(nèi)容不會丟失凹炸。這些存儲器從功能和連接上又可分為以下幾類:
- 隨機存儲器
用于存放共 CPU 使用的絕大部分程序和數(shù)據(jù)戏阅,主隨機存儲器一般由兩個位置上的 RAM 組成昼弟,裝在主板上RAM和插在擴展插槽上的RAM。 - 裝有 BIOS的ROM(BIOS:Basic Input/Output System)
BIOS 是有主板和各類接口卡(如顯卡奕筐、網(wǎng)卡等)廠商提供的軟件系統(tǒng)舱痘,可以通過它利用該硬件設(shè)備進行最基本的輸入輸出变骡。在主板和某些接口卡上插有存儲相應(yīng)BIOS的ROM。例如芭逝, 主板上的ROM中存著主板的BIOS塌碌;顯卡上的ROM中存儲著夏卡的BIOS;如果網(wǎng)卡裝有 ROM旬盯,那么其中就可以存儲網(wǎng)卡的BIOS - 接口卡上的RAM
某些接口卡需要對大批量輸入台妆、輸出數(shù)據(jù)進行暫時存儲,在其上裝有 RAM胖翰。最典型的顯示卡上的 RAM接剩,一般為顯存。顯示卡隨時將顯存總的數(shù)據(jù)向顯示器上輸出萨咳。換句話說懊缺,我們將需要顯示的內(nèi)容寫入顯存,就會出現(xiàn)在顯示器上培他。
圖 2-7 展示了 PC 系統(tǒng)中各類存儲器的邏輯連接情況
2.16 內(nèi)存地址空間
什么是內(nèi)存地址空間鹃两? 舉例來講,一個CPU的地址總線寬度為 10舀凛, 那么可尋址 1024 個內(nèi)存單元俊扳,這 1024 個可尋到的內(nèi)存單元就構(gòu)成了這個CPU的內(nèi)存地址空間。
上面介紹的那些存儲器猛遍,在物理上都是獨立的器件拣度,但是在以下兩點上相同。
- 都和CPU的總線相連
-
CPU 對它們進行讀或?qū)懙臅r候都通過控制線發(fā)出內(nèi)存讀寫命令
這也就是說螃壤,CPU 在操控它們的時候抗果,把它們當(dāng)做內(nèi)存來對待,把它們總的看做一個由若干存儲單元組成的邏輯存儲器奸晴,這個邏輯存儲器就是我們說的內(nèi)存地址空間冤馏。在匯編學(xué)習(xí)過程中,我們所面對的就是內(nèi)存地址空間寄啼。
如圖所示逮光,所有的物理存儲器都被看做一個由若干存儲單元組成的邏輯存儲器,每個物理存儲器在這個邏輯存儲器中占有一個地址段墩划,即一段地址空間涕刚。CPU 在這段地址空間中讀寫數(shù)據(jù),實際上就是在相對應(yīng)的物理存儲器中讀寫數(shù)據(jù)乙帮。
假設(shè)杜漠,圖 1-8 中的內(nèi)存地址空間的地址段分配如下:
- 地址 0~7FFFH的 32 KB 空間為主隨機存儲器的地址空間(RAM主存儲器材);
- 地址8000H~9FFFH的8KB空間為顯存地址空間;
- 地址A000H~FFFFH 的 24 KB 空間為各個ROM的地址空間驾茴;
(溫馨提示:如果對于 16 進制到 空間的轉(zhuǎn)換盼樟,看不明白,需要仔細計算下上面的說法)
這樣锈至,
- CPU 向內(nèi)存地址為 1000H的內(nèi)存單元寫入數(shù)據(jù)晨缴,這個數(shù)據(jù)就被寫入主隨機存儲器中;(1000H < 7FFFH)
- CPU 向內(nèi)存地址為 8000H 的內(nèi)存單元寫入數(shù)據(jù)峡捡,這個數(shù)據(jù)就被寫入到了顯存中击碗,然后顯卡輸出到顯示器上;(8000H < 9FFFH & 8000H > 7FFFH)
- CPU 向內(nèi)存地址為 C000H 的內(nèi)存單元寫入數(shù)據(jù)的操作是沒有結(jié)果的们拙, C000H 單元中內(nèi)容只讀不能修改延都。C000H 單元實際上就是 ROM存儲器中的一個。(C000H > A000H & C000H < FFFFH)
內(nèi)存地址空間的大小受 CPU 地址總線寬度的限制睛竣。 8086CPU 的地址總線寬度為 20晰房,可以傳送 2^20 個不同的地址信息(0 ~ 2^20 - 1)。也就是說可以定位 2^20 個內(nèi)存單元射沟,則 8086CPU 的內(nèi)存地址空間大小為 1MB殊者。同理,80386CPU 的地址總線寬度為 32验夯,則內(nèi)存地址空間最大為 4 GB猖吴。
我們基于一個計算機硬件系統(tǒng)編程的時候,必須知道這個系統(tǒng)的內(nèi)存地址空間分配情況挥转。因為當(dāng)我們想在某類存儲器中讀寫數(shù)據(jù)的時候海蔽,必須知道它的第一個單元的地址和最后一個單元的地址钱烟,才能保證寫操作是在預(yù)期的存儲器中進行祷蝌。比如藻懒,我們希望向顯示器輸出一段信息卡骂,那么必須將這段信息寫到顯存中,顯卡才能將它輸出到顯示器上茫经。而要想向顯存中寫入數(shù)據(jù)雪侥,必須知道顯卡在內(nèi)存地址空間的地址郎逃。
不同的計算機系統(tǒng)的內(nèi)存地址空間的分配情況是不同的壤玫。如圖 2-9 8086PC 機內(nèi)存地址空間分配情況:
8086CPU 有 16 根數(shù)據(jù)總線和 20 根地址總線
從圖中可以得知豁护,
- 從地址 0~9FFFF 的內(nèi)存單元中讀取數(shù)據(jù),實際上就是在讀取主隨機存儲器中的數(shù)據(jù)欲间;
- 向地址 A0000~BFFFF 的內(nèi)存單元寫數(shù)據(jù)楚里,就是向顯存中寫入數(shù)據(jù),這些數(shù)據(jù)會被顯卡輸出到顯示器上猎贴;
- 向地址 C0000~FFFFF 的內(nèi)存單元寫入數(shù)據(jù)的操作無效班缎,因為這段地址是訪問的只讀存儲器的內(nèi)容
內(nèi)存地址空間小結(jié)
最終運行程序的是 CPU蝴光,我們用匯編語言的時候,必須要從 CPU 的角度考慮問題吝梅。對 CPU 來講,系統(tǒng)中的所有存儲器中國的存儲單元都處于一個統(tǒng)一的邏輯存儲器中惹骂,它的容量收CPU尋址能力的限制苏携。這個邏輯存儲器即使我們所說的內(nèi)存地址空間。
DONE对粪!整理耗時 5 小時