天天看點

【彙編語言/底層開發】2、CPU的寄存器

寄存器是CPU中用于高速存取暫存資料的存儲部件。通過改變寄存器中的資料,可以對CPU的行為進行控制。對于8086CPU,内部共有14個寄存器,位寬均為16位,分别是AX, BX, CX, DX, SI, DI, SP, BP, IP, CS, SS, DS, ES, PSW。不同的寄存器所起到的作用不同。

      通用寄存器指的是AX, BX, CX, DX四個寄存器,可以用于存放通用資料。每一個通用寄存器可以存放16位資料,而由于上一代CPU的寄存器為8位,考慮到相容性,每一個通用寄存器可以按照高八位和低八位分成兩個8為寄存器,名稱分别為xH和xL(如AH/AL等)。這分割出來的8位寄存器在使用中都是獨立的寄存器。,在資料超過8位的時候會産生溢出。比如AL中的資料如果超過了8位,那麼多餘出來的位數并不會影響到AH中的資料。通過這樣的寄存器結構,CPU可以一次性處理位元組Byte和字Word(2位元組)兩種尺寸的資料。

      彙編語言的指令和寄存器名稱不區分大小寫。較常用的例如:

其實隻需明白一點就是,操作的結果儲存于兩個操作數的前者就好了。另外需要注意的是, 兩個操作對象的位數必須一緻,例如mov ax, bl這樣的指令就是錯的。

    現在的CPU主流已經是64位,部分老式機器是32位,而8086CPU是16位。對于8086而言,所謂16位CPU指的是,運算器的寬度為16位,即一次可以計算16位的資料,寄存器最大寬度是16位,二者之間的内部總線寬度也是16位。對于32位、64位機器則是同樣的道理。

    8086的外部位址總線的寬度為20位,尋址能力為1M,是以在實際操作中,需要CPU用16位的資料表示20位的位址。為了實作這樣的功能,8086通過提供了兩個16位的位址:段位址和偏移位址,由位址加法器将短位址左移四位并與偏移位址相加來合成實體位址。通過這樣的方式,CPU将記憶體位址看做一個整段+一個偏移量的方式來表示,也是因為這樣的緣故,一個段的起始位址一定是16的倍數,長度最大是64KB。

      8086包含四個段寄存器:CS, DS, SS, ES,分别作為代碼段寄存器、資料段寄存器、堆棧段寄存器和額外段寄存器。另外IP寄存器作為指令指針寄存器。在任意時刻,CPU從CS×16+IP的記憶體位址中擷取指令并執行,位址可以記為CS:IP。讀取完成一條指令後,IP中的值可以根據剛剛讀取指令的長度自動增加,使CPU可以輕易讀取下一條指令。在剛剛啟動時,CS和IP的初始狀态為CS

= FFFFH,IP = 0000H。

      8086的工作流程如:

從CS:IP中讀取指令,進入指令緩沖器;

IP向下移動指令長度,指向下一條指令;

執行,循環這個過程。

      修改CS和IP寄存器采用jmp指令:

繼續閱讀