匯編入門
一、基礎知識
( 1 )機器語言
機器語言是機器指令的集合。電子計算機的機器指令是一系列二進制數字。計算機將之轉換為一系列高低電平脈沖信號來驅動硬件工作的。
(2)匯編語言的產生
我們知道機器只能看懂機器語言,也就是0和1。實際上0和1只是我們規定的數字,機器其實連0和1也看不懂,這里的0和1實際上是指兩種不同的電壓狀態,計算機是用電的,它能理解的就是電壓的變化,所以我們通過不同的電壓驅動計算機運算,來完成我們所需要的任務。
在早期,人們通過紙帶來編程,打孔的地方表示1, 不 打孔的地方表示0,然后將紙帶輸入計算機中。這種方式不但費時費力,而且不同發現錯誤。
例如下面的程序:
-
Java 代碼
1
101110000000000000000011
2
000001010000000000110000
3
001011010000000000000101
這是8086CPU完成運算s=768+12288-1280的程序,如果這個程序中錯誤的將一個0寫成了1,試想要想發現這個錯誤是多么的困難。
為了方便人們編寫程序,并且避免01代碼容易出錯的問題,人們發明了匯編語言。
例如:機器指令1000100111011000表示把寄存器BX的內容送到AX中。匯編指令則寫成 mov ax,bx 。這樣的寫法與人類語言接近,便于閱讀和記憶。
(3)匯編語言的組成
匯編指令 ( 機器碼的助記符,有對應的機器碼 ) ;
偽指令 ( 由編譯器執行 ) 和 其他符號 ( 由編譯器識別 ) 。
(4) 存儲器
CPU工作需要指令和數據,指令和數據存儲在存儲器中。
(5)指令和數據
在內存或者磁盤中存儲的都是為二進制信息, 指令和數據由我們設定(走的總線) 。
(6) 存儲單元
? 存儲器被劃分為若干個存儲單元,每個存儲單元從0開始順序編號。
? B、KB、MB、GB、TB等單位。
(7)CPU對存儲器的讀寫
我們知道數據和指令是放在內存中的,CPU通過總線對存儲器進行訪問,但實際上總線是分為三部分的,即地址線,控制線和數據線。地址線表示CPU要對內存中的哪個地址進行操作,所以地址線的條數決定了CPU能夠訪問的內存范圍,因為一根線上最多只能有兩種不同的狀態即0和1,所以10根地址線能夠訪問的存儲單元的個數就是2^10個。
地址 線僅僅 是送出了要操作的地址,但是并沒有聲明要進行什么操作,所以控制線就是來決定對存儲單元的操作的。所以說控制線的條數決定了CPU能夠執行的操作的種類。
數據線是用來在CPU和內存之間進行數據傳送的,所以數據線的條數決定了一次最多傳送的數據的數量,例如8根數據線一次就能傳送8個bit即一個字節。
上圖展示了CPU從3號內存單元中讀取數據的過程。首先CPU利用數據線送出地址3,然后通過控制線發送讀命令,然后內存將結果通過數據線返回給CPU。
(8) 內存地址空間
什么是內存地址空間呢?舉例來講,一個CPU的地址總線寬度為10,那么可以尋址1024個內存單元,這1024個可尋到的內存單元就構成了這個CPU的內存地址空間。當然這里所說的內存并不單單是內存條中的內存,還包括其他各種外設中的RAM和ROM。例如,顯卡也有自己的內存,用來存儲在顯示屏上顯示的內容,另外顯卡BIOS ROM也被 當做 是內存空間中的一部分,此外還有網卡的BIOS ROM和系統BIOS ROM地址空間等。
因此我們在基于一個計算機硬件系統編程時,必須要知道這個系統中的內存地址空間分配情況。應為當我們想在某類存儲器中讀寫數據的時候,必須知道它的第一個單元地址和最后一個單元地址,才能保證讀寫操作是在預期的存儲器中進行的。比如,我們希望在顯示器上輸出一段信息,那么必須將這段信息寫到顯存中,顯卡才能將它輸出到顯示器上,要想向顯存中寫入數據,必須知道 顯存在 地址空間中的地址。
上圖展示了8086PC機內存地址空間分配的基本情況。從地址0~9FFFF的內存單元中讀取數據,實際上就是在 讀取住 隨機存儲器中的數據;向地址A0000~BFFFF的內存單元中寫數據,就是向顯示器中寫入數據,這些數據 會被顯卡 顯示到顯示器上;我們向C0000~FFFFFF的內存單元中寫入數據的操作是無效的,因為這等于改寫只讀存儲器中的內容。
小結:
1、匯編指令時機器指令的助記符,與機器指令一一對應。
2、每一種CPU都有自己的匯編指令集。
3、CPU可以直接使用的信息在存儲器中存放。
4、在存儲器中指令和數據都是二進制信息。
5、存儲單元從0開始順序編號。
6、一個存儲單元可以存儲8個bit。
7、B、KB、MB、GB等單位之間的轉換。
8、CPU管腳和總線相連。總線的寬度表示CPU不同方面的性能:
(1)地址總線的寬度決定了CPU的尋址能力;
(2)數據總線的寬度決定了CPU與其他器件進行一次數據傳送的量;
(3)控制總線寬度決定了CPU對系統中其他器件的控制。
二、寄存器(CPU的工作原理)
CPU由運算器、控制器、寄存器 等器件組成,靠內部總線相連。
內部總線實現CPU內部各器件之間的聯系;外部總線實現CPU和主板上其他器件的聯系。
在CPU中:
(1)運算器進行信息處理;
(2)寄存器進行信息存儲;
(3)控制器控制各種器件進行工作;
(4)內部總線連接各種器件在它們之間進行數據的傳送。
1、 通用寄存器
8086有14個寄存器:
AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、CS、ES、PSW。
AX、BX、CX、DX通常用來存放一般性數據,被稱為通用寄存器。
16位寄存器所能存儲的數據最大值為2^16-1 。
為保證兼容性,8086 CPU的通用寄存器可以分為兩個獨立的8位寄存器使用。例: AX可分為AH和AL。
2、 字在寄存器中的存儲
(1)8086 CPU所有的寄存器是16位,可以存放2個字節(一個字)
(2) 一 字節由8 bit 組成,可以存在8位寄存器中
(3)字(word)是兩字節,16位。
3、幾條匯編指令
匯編指令對大小寫不敏感
4、 物理地址
? 所有的內存單元構成一個一維的線性存儲空間。
? CPU訪問內存單元時要給出內存單元的唯一地址就是物理地址。
5、16位結構的CPU
? 運算器一次最多可以處理16位數據。
? 寄存器的最大寬度為16位。
? 寄存器和運算器之間的通路是16位。
6、 8086 CPU給出物理地址的方法
? 8086有20位的地址總線,可以傳送20位地址,尋址能力為1M;但8086內部為16位結構,只能傳送16位的地址。
? 8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。
8086CPU讀寫內存的步驟:
(1)CPU中的相關部件提供段子和偏移地址這兩個16位的地址;
(2)段地址和偏移地址通過內部總線送入到一個稱為地址加法器的部件;
(3)地址加法器將兩個16位地址合并成一個20位的地址;
(4)地址加法器通過內部總線將20位物理地址 送 送入輸入輸出地址;
(5)輸入輸出控制電路將20位物理地址送上地址總線;
(6)20位物理地址被地址總線傳送到存儲器。
地址加法器工作原理:物理地址=段地址*16+偏移地址。
段地址*16就是數據左移4位(二進制)
一個數據的二進制形式左移N位,相當于該數據乘以2的N次方。一個數據X進制形式左移N位,相當乘以N^X。
7、段地址*16+偏移地址=物理地址
CPU可以通過不同的段地址和偏移地址形成一個相同的物理地址。
8、段的概念
人為定義的,將若干地址連續的內存單元看作一個段。用段地址*16定位段的起始地址(基址),用偏移地址定位段中的內存單元。
一個段的起始地址是16的倍數。偏移地址為16位,尋址能力為64K,所以段的最大長度也是64K
三、寄存器(內存訪問)
1、 mov 、add、sub指令
? 有兩個操作對象, jmp 只有一個操作對象。
? 使用 匯編金 手指查閱指令
? mov 指令的幾種形式
-
Java 代碼
1
mov 寄存器,數據;???????????? mov ax,8
2
mov 寄存器,寄存器;????????? mov ax,bx
3
mov 寄存器,內存單元;????? mov ax,[0]
4
mov 內存單元,寄存器;????? mov [0],ax
5
mov 段寄存器,寄存器;????? mov ds,ax
6
mov 寄存器,段寄存器;????? mov ax,ds
? add指令的幾種形式
-
Java 代碼
1
add 通用寄存器,數據
2
add 通用寄存器,通用寄存器
3
add 通用寄存器,內存單元
4
add 內存單元,寄存器
? sub指令的幾種形式
-
Java 代碼
1
sub 通用寄存器,數據
2
sub 通用寄存器,通用寄存器
3
sub 通用寄存器,內存單元
4
sub 內存單元,通用寄存器?
2、 棧
? 具有特殊的訪問方式的存儲空間,也是內存空間的一部分,數據 先進后出。
? 有兩個基本操作:
o 入 棧 :將一個新的元素放到 棧 頂;
o 出 棧 :從 棧 頂取出一個元素。
? 棧 頂元素最后入 棧 最先出 棧 。
3、8086 CPU提供的 棧 機制
現今的CPU都有 棧 的設計,基于8086CPU編程可以將一段內存當作 棧 來使用。
8086CPU的入 棧 (PUSH)和POP(出 棧 ),以字為單位。
push ax 將寄存器ax中的數據送入 棧
pop ax 從 棧 頂取出數據送入ax
段寄存器SS存放 棧 頂的段地址,寄存器SP存放 棧 頂的偏移地址。任意時刻SS:SP指向 棧 頂元素。push時SP先自減法后寫內存,pop先讀內存 sp 后自加。
pop之后數據還是存在內存中,push時覆蓋。
CS和IP存放當前指令的段地址和偏移地址。
4、 棧 頂越界的問題
? 棧 是空的,則SP指向 棧 底+1的內存。
? 8086 CPU只紀錄 棧 頂, 棧 空間由自己控制。 棧 頂越界問題導致溢出漏洞。
? 8086CPU只考慮當前的情況:
o 當前 棧 頂在何處;
o 當前要執行的指令時哪一條。
匯編語言
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。