彙編基礎

一、寄存器

  • 學習彙編語言以Intel8086CPU爲基礎會更容易掌握。要知道,微型計算機的字長與微處理器的寄存器位數有關。以Intel 80X86系列微處理器爲例,CPU是8086/8088、80286的字長是16位(二進制位bit),那麼它們的寄存器的位數一定是16位的;32位字長的微機CPU是80386/80486或者Pentium系列,它們的寄存器的位數則是32位的。

  • 在計算機中還規定採用字節、字、雙字等單位來表示數據。
    字節(Byte):8位二進制數。如00000101B,或表示成05H;10000101B,或表示成85H。
    字(Word):16位二進制數,等於2字節。如1100010111010110B,或表示成C5D6H。
    雙字(Double Word):32位二進制數,又稱爲雙精度數,等於4字節。如23456789H。
    8086寄存器都是16位的寄存器,根據用途可分爲4種類型。分別是數據寄存器、地址寄存器、段寄存器和控制寄存器。如圖所示。
    這裏寫圖片描述

  • 數據寄存器中每個寄存器又可以分爲2個8位的寄存器。分別爲AH、AL,BH、BL,CH、CL,DH、DL。H表示高字節(高8位)寄存器、L表示低字節(低8位)寄存器。例如 用AX寄存器存放一個字1234H,表示爲(AX)=1234H,即高字節12放在AH,低字節34放在AL中。

  • 地址寄存器包括指針和變址寄存器SP、BP、SI、DI四個16位寄存器。顧名思義,它們可用來存放存儲器操作數的偏移地址。另外,它們也可以作爲通用寄存器用。

  • 8086CPU有4個16位的段寄存器,分別是CS代碼段寄存器、DS數據段寄存器、ES附加段寄存器、SS堆棧段寄存器。

  • 控制寄存器包括IP和FLAGS(又稱爲PSW程序狀態字)兩個16位寄存器。用於控制程序的執行。IP 指令指針寄存器,用來存放代碼段中的偏移地址,指出當前正在執行指令的下一條指令所在單元的偏移地址。 FLAGS標誌寄存器中的某位代表CPU的1個標誌,表示出CPU的某種執行狀態。最低位爲D0,最高位爲D15。8086CPU的標誌寄存器共有9個標誌,分別爲6個條件碼標誌和3個控制標誌。如圖:
    這裏寫圖片描述

(1) 條件碼標誌
CF進位標誌。當指令執行結果的最高位向前有進位時,CF=1,否則CF=0。
SF符號標誌。當指令執行結果的最高位(符號位)爲負時,SF=1,否則SF=0。
ZF零標誌。當指令執行結果爲0時,ZF=1,結果不爲0時,ZF=0。
OF溢出標誌。當指令執行結果有溢出(超出了數的表示範圍)時,OF=1,否則OF=0。
AF輔助進位標誌。當指令執行結果的第3位(半字節)向前有進位時,AF=1,否則AF=0。
PF奇偶標誌。當指令執行結果中1的個數爲偶數個時,PF=1,否則PF=0。

(2)控制標誌
DF方向標誌。執行串處理指令時,若設置DF=0,存儲單元的地址寄存器的值自動增加,若設置DF=1,存儲單元的地址寄存器的值自動減小。
IF中斷標誌。設置IF=1,允許CPU響應可屏蔽中斷,IF=0則不響應。
TF陷阱標誌。在DEBUG調試時,TF=1,採用單步執行方式,即進入陷阱;TF=0,正常執行程序。
例: 兩個二進制數相加運算,有關標誌位自動發生變化。
這裏寫圖片描述

  • 根據計算結果可知CPU會自動地把標誌位設爲:CF=0,SF=1,ZF=0,OF=0,PF=0,即無進位,結果爲負數,結果不爲0,沒有溢出,奇數個1。 對溢出的判斷也可以從簡單的角度理解,因爲進行運算的二進制數是補碼,可看出本題是一個負數和一個正數相加,結果爲負數,不溢出。若兩個正數相加,結果爲負數,或者兩個負數相加,結果爲正數,那都是溢出了,說明8位補碼已經表示不了該結果。
  • 在DEBUG調試環境下以字母縮寫的形式表示各個標誌位的狀態。進入DEBUG後,用R命令查看寄存器狀態時,可以看到除了陷阱標誌以外的標誌位的狀態。如表2-1所示。
    這裏寫圖片描述

  • 在計算機中,對帶符號數可用真值和機器數兩個概念表示。真值,就是帶有“+”、“-”號的實際數值;所謂機器數,則是把“+”、“-”符號數值化(0、1)後所得到的計算機實際能表示的數。

  • 機器數有三種碼錶示,分別是原碼、反碼和補碼。彙編語言中,數都是以補碼的形式表示的,因此必須掌握數的補碼錶示和補碼的運算。這三種碼的定義如下:
    原碼。原碼將最高位作爲符號位,正數爲0,負數爲1,其餘7位作爲數值位。
    反碼。正數的反碼與正數的原碼一樣。而求負數的反碼時,符號位爲1,數值位在原碼的基礎上求反。
    補碼。正數的補碼與正數的原碼一樣。求負數的補碼時,符號位爲1,數值位在原碼的基礎上求反加1。
    例 十進制數+5和-5分別表示成二進制數原碼、反碼和補碼。
    [+5]原=[+5]反=[+5]補=00000101B
    [-5]原=10000101B
    [-5]反=11111010B
    [-5]補=11111011B

二、內存

  • 在彙編語言中,內存是非常重要的學習內容。我們先要對內存地址和存儲單元的概念進行學習。對存儲單元的標識可以用物理地址或邏輯地址表示。物理地址是內存單元的真實地址,存儲單元的物理地址是唯一的。Intel8086CPU有20根地址線,因此其存儲空間可達2的20次方=1M個字節單元(1MB)。地址都是從0開始的,在20位地址線的存儲空間中採用十六進制表示的物理地址範圍是00000H~FFFFFH。

  • 邏輯地址是用戶編程時使用的地址,分爲段地址和偏移地址兩部分。在8086彙編語言中,把內存地址空間劃分爲若干邏輯段,每段由一些存儲單元構成,每段最大爲65536個字節單元(0號單元~65535號單元0000H~FFFFH)。用段地址指出是哪一段,偏移地址標明是該段中的哪個單元。段地址和偏移地址都是16位二進制數。邏輯地址的形式:
    段地址:偏移地址
    這裏寫圖片描述

例如:在上圖中,內存劃分出了若干段。0號段,1號段,…,每一段都有0號單元、1號單元、2號單元,…。每段的長度可以不一樣,如0號段從0號單元到0FH號單元共16個字節單元,1號段從0號單元到0139H號單元共314個字節單元。用段地址表示段號,偏移地址代表每一段中的單元號,比如0000:0002H代表0號段的2號單元,0001:0002H代表1號段的2號單元,以此類推。因此,偏移地址的通俗含義是在該段內,相對於段地址偏移了多少個單元。

  • 用戶編程時採用的邏輯地址在CPU執行程序時都要轉換成實際的物理地址,這個轉換過程是由CPU中的地址加法器自動完成的。轉換時先將16位的段地址左移4位,相當於乘以16或十六進制的10H,再和偏移地址相加。轉換公式爲:
    物理地址=段地址×10H+偏移地址
    例: 若某單元的邏輯地址爲0001:0002H,其物理地址=0001H×10H+0002H=00012H
    另一單元的邏輯地址爲3020:055AH,其物理地址=3020H×10H+055AH=3075AH
    存儲器邏輯分段類型如下: 代碼段——用於存放指令,段地址存放在段寄存器CS。 數據段——用於存放數據,段地址存放在段寄存器DS。 附加段——用於輔助存放數據,段地址存放在段寄存器ES。 堆棧段——是重要的數據結構,可用來保存數據、地址和系統參數,段地址存放在段寄存器SS。
    這裏寫圖片描述

  • 存儲單元中的數據稱爲存儲單元內容,一個實際的存儲單元只能存放一個字節(8位二進制)的數據。存儲單元的地址和內容的表示形式爲用括號將地址括起來以代表單元的內容。如(3075AH)=12H,表示3075AH號單元中的內容是12H,稱爲字節單元;若(37692H)=5678H,表示37692H單元和37693H單元一起存放5678H,該單元是字單元。字單元在存儲的時候,高字節放在高地址單元,低字節放在低地址單元,即56H放在37693H單元,78H放在37692H單元。如圖:
    這裏寫圖片描述

三、DEBUG的主要命令

DEBUG命令有20多個,我們主要學習最常用的命令。
● R ——查看和修改寄存器
● D ——查看內存單元
● E ——修改內存單元
● U ——反彙編,將機器指令變爲彙編指令
● T /P——單步執行
● G ——連續執行程序
● A ——輸入彙編指令
● Q ——退出
(1)R命令——查看和修改寄存器
R命令有兩種用法:直接鍵入R——將顯示CPU所有的寄存器和標誌位;
修改寄存器——在R後跟寫寄存器名,回車後先顯示寄存器的內容,在冒號後鍵入新的值;再用R命令就可看到修改後的內容了。
(2)D命令——查看內存單元
前面我們學到,內存每16個字節單元爲一小段,邏輯段必須從小段的首址開始。用D命令可以查看存儲單元的地址和內容。
其中左邊一列爲邏輯地址,中間部分爲存儲單元的內容。每行爲16個字節單元,中間的小橫線用於區分前8個單元和後8個單元。在邏輯地址中只給出每行第一個單元的偏移地址,其餘15個單元的偏移地址沒有標出。
(3)E命令——修改內存單元
用E命令可以改寫多個存儲單元的內容。格式爲:E 起始地址 修改值 修改值 …
程序員編寫的彙編語言源程序經過彙編(編譯)後生成了二進制的機器指令代碼,而U命令可將二進制的機器指令變爲助記符形式的彙編指令,因此稱之爲“反彙編”。通過U命令,我們可以得到機器指令與彙編指令的對照,瞭解機器指令的存儲情況。
(5)A 命令——輸入彙編指令
在DEBUG中,使用A命令可以輸入彙編指令,系統自動地將鍵入的彙編指令翻譯成機器代碼,並相繼地存放在從指定地址開始的存儲區中。由於DEBUG下的數值默認爲十六進制數,因此先要將十進制數轉換成十六進制數。
(6)T/P命令——單步執行
輸入完指令後,應該執行它。T命令可以一條一條地執行指令。P命令的作用與T命令相同,當遇到中斷指令INT n和調用指令CALL時,應該使用P命令,以確保程序正常執行。這是因爲INT n指令和CALL指令都要轉移到子程序去執行,T命令進入子程序後可能無法返回;而P命令則直接執行該指令,並將結果帶回。遇到循環指令LOOP時也應該使用P命令,可以使循環快速結束。
(7)G命令——連續執行程序
(8)Q命令 ——退出DEBUG
鍵入Q,回車後退出DEBUG,返回到DOS下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章