組合語言-基礎知識

W&B發表於2021-04-01

組合語言-基礎知識

組合語言的產生

計算機作為一個只能讀懂和執行二進位制的東西,在其剛被發明出時,都是用機器語言(01二進位制形式表示)來寫入程式,隨著程式越來越複雜,需要更長的組合,不光一個微小的0->1將會導致錯誤,以及過於難記憶與分辨。

隨後找到了一種解決方法,將這些最基礎二進位制的指令,用一串字元表示,再由電腦的彙編器(Assembler)將這串字元轉化成二進位制機器語言,程式設計師只需要負責寫彙編指令的原始碼即可。

組合語言由三部分組成:

  1. 彙編指令(有與其專門對應的機器碼)
  2. 偽指令(由彙編器執行,沒有與其專門對應的機器碼)
  3. 其他符號(如+,-,*,/由彙編器執行,沒有與其專門對應的機器碼)

程式放在哪裡

CPU是電腦能夠運算的核心部件,但是想要指揮CPU,需要有指令和資料,儲存執行中程式的指令和資料的就是常說的記憶體。對於磁碟中的資料, CPU無法直接直行,需要載入到記憶體中才可以被CPU所使用。

指令和資料一樣,都是一串二進位制碼, CPU在工作的時候,會根據需要把它們解釋成指令或者資料,例如1000101111000011這一串二進位制碼,它既可以表示資料8BC3_H,又可以表示指令mov ax, bx (8086CPU中)。

對於記憶體,目前的方式均為以8個bit即1byte為最小的儲存單元(1byte可以儲存8位二進位制數), CPU想從記憶體中讀取或者儲存資料,首先需要找到要存在記憶體的地址,傳達控制資訊是讀入還是寫入,以及讀或寫的資料。

在一臺計算機中, CPU通過匯流排,與記憶體等外部裝置進行連線,匯流排可分為三種,分別是地址匯流排,資料匯流排以及控制匯流排,字如其意,地址匯流排負責找到要讀取或者儲存的那個位置,資料匯流排負責資料的傳輸,控制匯流排負責傳輸要執行的行為是讀入還是寫入。對於8086CPU,他的地址匯流排有20根,資料匯流排有16根,也就是說他的定址空間為2^20Byte,也就是最多可以定址1MB記憶體,最多每次只能傳輸16bit(2Byte)的資料。控制匯流排與上面所說的地址匯流排和資料匯流排不同,他只是一個總稱,是計算機不同控制線的集合,控制線分別連線於不同的 外部裝置,控制線越多,能控制的外部裝置就越多。

記憶體的地址空間

以典型的8086CPU為例子,他含有20條地址匯流排,定址空間最大可達到2^20(00000 -> FFFFF )yte。CPU有20條地址針腳,這些針腳被接在主機板上的CPU槽位,通過主機板上的地址線連線到各種bios(Base input/output system),和擴充介面。

這些記憶體地址被分配給不同的功能器件,不同的計算機系統分配記憶體地址空間 的方式也不同,以8086CPU為例,00000到9FFFF為主存(RAM)空間,A0000到BFFFF為視訊記憶體的地址空間,C0000到FFFFF為各類ROM(內容無法更改)地址空間。

拆開CPU

一個典型的CPU內部,由運算器,暫存器和控制器等組成,這些器件之間靠內部匯流排連線,在上面部分說到的均為外部匯流排,他們被埋在主機板中。簡單來說:運算器負責執行運算操作,暫存器負責儲存運算器要使用的資料,控制器負責控制各種器件協同工作。

對CPU來說,最能直接控制的是它的暫存器,我們通過控制暫存器,來實現對CPU的操作,不同的CPU暫存器的數量與結構不同。8086CPU包含14個暫存器,均為16bit,分別是:

  1. AX,BX,CX,DX,4個通用暫存器,可分為高低8位獨立使用
  2. CS,DS,ES,SS,4個段暫存器
  3. BP,SP,SI,DI,4個指標暫存器
  4. FR,標誌暫存器
  5. IP,程式計寄存數器

8086的定址方式

對於8086CPU它包含20條地址匯流排,和16條資料匯流排,如何用16位達到20位的定址呢?8086CPU採用的是:實體地址=段地址*16+段內偏移地址 的方式。比如說段地址是2000H,段內偏移地址是0016H,它所指向的實體地址就是20000H+0016H=20016H。在8086CPU中執行將斷地址和段內偏移地址轉化成實體地址的器件是地址加法器。

CS段暫存器和IP暫存器

CS和IP可以說是CPU中最重要的兩個暫存器,他們指示出CPU當前要讀取的指令地址, CPU將CS16+IP所指向的記憶體地址之後的若干個記憶體單元壓入指令快取區,通過對指令的解碼來拆分出指令,和指令長度N,IP變為IP+N。(8086CPU作為初代X86架構,是CISC指令集,每個指令及長度不等)*。

如果計算機只能按照IP不僅自增順序執行的話那肯定是不行的,因為很顯然,如果計算機不能迴圈,那麼只能把重複的指令不停的寫,這是非常不聰明的做法。想要實現迴圈就需要修改CS和IP暫存器中的內容,在之前有過例子,如果我們想將0045H放到暫存器ax,可以用mov ax, 0045H,但是這對CS和IP暫存器是不可以,系統沒有提供直接對他們賦值的操作(mov ip, 0045H ;這樣的是非法操作),改變他們內容的有一套專門的指令,被稱為跳轉指令。

;跳轉指令的用法
jmp 6000H:0984H ;同時修改CS段地址和IP地址 jmp CS段地址:IP地址
jmp 0984H       ;只修改IP地址,直接常數賦值
jmp AX          ;只修改IP地址,把ax的內容賦值給IP 

相關文章