前言導讀:指令的存儲與執行初探、從零開始構造一臺二進制加法器.net
一個微處理器一般有多個用來尋址存儲器的輸出信號。code
例如因特爾公司生產的8080處理器,是一個具備重大歷史意義的芯片,本篇主要以8080爲例作敘述。
blog
8080是一個8位的微處理器,能夠一次從存儲器讀取或寫入8位數據。看上圖,A0~A15表示16個可用於尋址的輸出信號,因此8080處理器可尋址的空間大小爲65536*8bit。如今假設8080處理器與一個65536字節大小的存儲器相連,當處理器復位後,經過在A0~A15輸出16個0,把鎖存在存儲器0000h處的字節(該字節必須是8080指令)讀入處理器,這個過程稱爲取指令。圖片
爲了方便使用指令,咱們爲處理器的每一條指令的操做碼都指派了一個助記符,這種助記符只是在咱們使用操做碼時方便一些,它對於處理器而言是沒有幫助的,由於處理器只能識別字節,對於助記符組成的文本一無所知。get
好比Load指令,每條Load指令佔3字節,第一個字節是操做碼,其後的兩個字節是要Load處處理器的操做數的16位地址。it
若是咱們用助記符能夠把指令轉換成下面的形式:class
LDA A,[aaaa]二進制
這裏的A表示處理器中的累加器,aaaa表示存儲器中的一個16位地址,若是該存儲器是8位,則取到的是一個字節。im
8080處理器內部除了累加器外還設置了6個寄存器,寄存器其實就是一個鎖存器,能夠存放一個字節的數。處理器能夠把數據從存儲器讀入寄存器,也能夠把數據從寄存器存回存儲器。在8080處理器中用B、C、D、E、H和L來表示新增的6個寄存器。一般把H和L合起來構成一個16位的寄存器對,H用來保存高字節而L用來保存低字節。這個16位值一般用來對存儲器尋址。總結
那麼寄存器內的數據可不能夠互相轉移呢?答案是能夠的,使用MOV指令就能夠把一個寄存器的內容轉移到另外一個寄存器。
來看這條指令:MOV B,[ HL ]
,這條MOV指令把存儲器中的一個字節轉移到B寄存器,這個字節的地址存放在寄存器對HL
裏面,這種方式叫作間接尋址。
有了間接尋址,那麼直接尋址是什麼樣的呢?
LAD A,[aaaa]
,[aaaa]
是一個16位地址,這個地址不須要存儲在寄存器中,而是經過處理器的A0~A15管腳信號獲得,這種尋址方式就叫作直接尋址。
因爲處理器中的寄存器衆多,因此MOV指令在8080處理器中多達32條。
上面說了,處理器只認識操做碼字節,一個操做碼字節是一個單字節指令。8080處理器中還有另一種雙字節MOVE指令,稱爲MVI(傳送當即數指令)。第一個字節爲操做碼,第二個字節是數據。這個數據從存儲器轉移到寄存器,或者從存儲器的一個單元轉移到另外一個單元。
例如,當指令MVI E,37h
執行後,寄存器E存放的字節是37h;又如指令MVI [HL],37h
執行後,會將37h這個數存儲到儲存器的某個地址,這個地址存儲在寄存器[HL]
中。這是要介紹的第三種尋址方式:當即數尋址。
總結下來三種尋址方式就是:
- 直接尋址:
LAD A,[aaaa]
- 間接尋址:
MOV B,[HL]
- 當即數尋址:
MVI E,37h
orMVI [HL],37h
當即尋址就是指令當中自帶數據,直接讀取,最快,噹噹即數尋址時,只容許源操做數爲當即數,目標操做數必須是寄存器或存儲器,其做用是給寄存器或存儲單元賦值。
直接尋址就是操做數通常存放在存儲器的中,而操做數的地址在指令中給出,即指令中存放的是操做數的地址,直接解析這個地址。
間接尋址的指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。