iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
3
Software Development

8086下16位元DOS組合語言學習筆記系列 第 4

[Day04] 通用暫存器

暫存器

接下來要介紹最令我頭痛的暫存器,8086 的 CPU 有 14 個暫存器,分別是:

AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

暫存器很特別只有組合語言有,其他高階語言都不會涉及暫存器,暫存器用於 CPU 運算過程中的資料暫存,例如想將 10 和 20 相加,必需先將 10 放入 AX,20 放入 BX,再透過 CPU 運算器將暫存器相加後得到結果,暫存器種類很多每種都有不同的功能,這裡先有個概念就好之後會再慢慢和大家介紹。

通用暫存器

14 個暫存器中有 8 個通用暫存器,其中 AX、BX、CX、DX 用於存放一般性的數據,這四個通用暫存器都是 16 位元,不過為了相容上一代 8 位元的 CPU,每個都可分為高位和低位兩個 8 位元的暫存器使用,例如 AX 是由高位 AH 和低位 AL 組成。

  • AX 可分為 AHAL
  • BX 可分為 BHBL
  • BX 可分為 BHBL
  • DX 可分為 DHDL

示意圖:

https://ithelp.ithome.com.tw/upload/images/20181019/20106865Z5ttfAA2A7.jpg

假設現在 AX 中存放的數據是。

0 1 1 1 1 0 0 0   0 1 0 1 1 0 0 0

這時 AH、AL、AX 分別表示:

  • AH: 120
  • AL: 88
  • AX: 30808

高位和低位暫存器可以分開來,也可以合在一起使用。

組合語言指令

組合語言的指令不分大小寫,和常見的高階語言不一樣。

mov ax, 10
; 等於
MOV AX, 10

接著介紹 mov 和 add 指令,mov 用於賦值,add 用於加法運算,這兩個指令都很常用到。

mov ax, 10   ; 將 10 放進 ax 暫存器中
add ax, 20   ; 將 ax 傳存器加上 20

mov 指令就類似高階語言的 =,add 指令類似 +=,可以將上面的例子看成。

ax = 10
ax = ax + 20

溢位

一個 16 位暫存器最大只能存放 FFFF,那如果超過了會發生什麼事,例如下列兩行指令,執行後 ax 暫存器的結果是什麼。

mov ax, FFFF
add ax, 1

答案是 0,當數值超過暫存器的上限,就會發生 溢位,FFFF + 1 = 10000 CPU 會將 1 捨棄,只保留後面四位,所以答案是 0。

結語

暫存器是組合語言的核心,也是我覺得組合語言最難學的地方,相信很多想學的人都是在這被嚇跑的,一開始看到那一堆的暫存器和指令,頭腦真的轉不過來,重複看好幾次腦中才慢慢有概念,組合語言要思考的面向比高階語言更多,常常需要繞好幾個彎才能完成一個簡單的運算,本系列文章希望寫的淺顯易懂,讓有心學習卻不得其門而入的人能跨過這一關,不知道大家吸收得如何?

今天就到這裡摟,感謝大家觀看。


上一篇
[Day03] 記憶體地址空間和第一次反組譯
下一篇
[Day05] 物理地址和段暫存器
系列文
8086下16位元DOS組合語言學習筆記12

尚未有邦友留言

立即登入留言