1. 程式人生 > 其它 >20192423楊斯凌 2021-2022-2 《組合語言程式設計》前四章學習報告

20192423楊斯凌 2021-2022-2 《組合語言程式設計》前四章學習報告

20192423楊斯凌 2021-2022-2 《組合語言程式設計》前四章學習報告

第一章


組合語言

  • 彙編指令是符號化的機器指令,它與機器指令一一對應——使用助記符(如MOV、ADD)表示相應的操作,使用地址或符號名(如AX)表示運算元。
  • 組合語言是彙編指令集(含偽指令集)和使用它們規則的統稱。
  • 偽指令是在程式設計時所需要的說明性指示語句,便於組織程式結構,無對應的機器指令
  • 本質上說:彙編指令就是符號化的機器指令,組合語言就是符號化的機器語言。

數制

數制 進位規則 基數 權值 舉例
十進位制 0~9 逢10進1 10 10^k
二進位制 0,1 逢2進1 2 2^k
十六進位制 0~9,A~F
逢16進1 16 16^k
八進位制 0~7 逢8進1 8 8^k

數制轉換

十進位制→二進位制

  • 降冪法
  1. 寫出要轉換的十進位制數
  2. 寫出小於此數的各位權值,直到1為止(包括1)
  3. 用要轉換的數減去與之最接近的權值,如果夠減則在相應位置記下1,否則計0;同時記錄差數,差數成為下一輪要轉換的數;直到權值為1的位置處有值為止
  4. 從左到右依次寫出各位,即為相應的二進位制數
  • 除法
  1. 整數
    將要轉換的十進位制數的整數不斷除以2,直到商0為止,記下各次的餘數(包括商0的那次)
    將第一個餘數至最後一個餘數從右向左排列寫出即為相應的二進位制數
  2. 小數
    將要轉換的小數部分不斷乘以2,直到結果的小數部分為0或給定的精度為止,記下各次積的整數部分(包括0的那次)

    將第一個整數部分值至最後一個整數部分值從左向右排列寫出即為相應的二進位制數

二進位制→十進位制

  • 按權展開求和——一個二進位制數的各位二進位制數碼乘以與其對應的權值之和

十進位制→十六進位制

  • 降冪法
  • 除法

二進位制→十六進位制

  • 從最低位(右起)開始每四位直接轉換為一位十六進位制數值

十六進位制→二進位制

  • 從最低位(右起)開始每位直接展開為四位二進位制數值

帶符號數的表示

  • 用最高位作為符號位,0代表“+”,1代表“-”,其餘位用作數值位,代表數值。

補碼

  • 基本規則——將一個數化為n位二進位制形式後,最高位用於表示符號,0表示正數,1表示負數。
    正數:與原碼相同,最高位為0,其餘位為相應二進位制值


    負數
    方法1:2n-該數的絕對值的二進位制形式
    方法2:該數絕對值的各位取反後末位加1

  • 補碼的數值範圍為[- 2n-1,2n-1-1]
    8位二進位制補碼錶示的數值範圍是-128~127
    16位二進位制補碼錶示的數值範圍是-32768~32767

  • 加法規則 :[X+Y]補 = [X]補 + [Y]補
    減法規則 :[X-Y]補 = [X]補 + [-Y]補

真值→補碼
正數:相應的二進位制形式
負數:絕對值相應的二進位制形式各位求反末位加1

補碼→真值
二進位制形式最高位為0:二進位制對應的值即為真值
二進位制形式最高位為1:各位求反末位加1得到真值絕對值的二進位制形式,在該值前面新增負號即為真值


字元表示

  • 字元:字母、數字及專門符號
    ASCII (American Standard Code for Information Interchange)碼,即美國資訊交換標準程式碼:用一個位元組來表示一個字元,低7位為字元的ASCII值。
  • 常用的ASCII碼
    ‘A ’ ~ ‘Z ’ : 41H~5AH
    ‘a’ ~ ‘z’ : 61H~7A H
    ‘0’ ~‘9’ : 30H~39H
    換行 0AH
    回車 0DH
    空格 20H

邏輯運算

與運算(AND)

A B A AND B
0 0 0
0 1 0
1 0 0
1 1 1

或運算(OR)

A B A OR B
0 0 0
0 1 1
1 0 1
1 1 1

非運算(NOT)

A NOT A
0 1
1 0

異或運算(XOR)

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

第二章

IBM-PC微機基本結構


一. 微機的一般構成

  • 計算機一般應包括五大部件:

      運算器、控制器、儲存器、輸入裝置和輸出裝置。
      將運算器和控制器兩大部件整合在一個積體電路晶片上,稱為中央處理器 ,簡稱CPU,也叫微處理器.
    

1. 中央處理器CPU

微型計算機中的中央處理器也叫微處理器。它包括運算器和控制器。

功能:
分析從主儲存器取來的各條指令的功能,控制計算機各部件完成指定功能的各項操作。
2. 主儲存器

- 主儲存器是用來存放程式和資料的部件。它由若干個儲存單元構成。
- 儲存單元的多少表示儲存器的容量。每個儲存單元使用一個唯一的編號來標識,稱為儲存單元的地址。
- 對每個儲存單元內容的存和取是按照地址進行訪問的。
- 計算機儲存資訊的最小單位是二進位制位bit,一位可儲存一個二進位制數0或1。每8位組成一個位元組(BYTE)。
- 在大多數計算機中,儲存器的組織都是以位元組為基本單位。每一個基本單位稱為一個儲存單元。

在計算機中,除了主儲存器之外,一般還配置有輔助儲存器,簡稱輔存。由於它的位置是在主機之外,因此也叫做外存。

3. 輸入輸出裝置及介面

-輸入裝置將外部資訊(程式、資料和命令)送入計算機。包括鍵盤、滑鼠等。
-輸出裝置將計算機處理後的結果轉換為人或其它系統能識別的資訊形式向外輸出。如顯示器、印表機等。
-有的裝置既具有輸入功能又具有輸出功能。如磁碟、磁帶、觸控顯示屏等。

I/O介面是主機與I/O裝置之間設定的邏輯控制部件。通過它實現主機與I/O裝置間的資訊傳送。

4. 系統匯流排

-系統匯流排將CPU、儲存器和I/O裝置連線起來,實現各大部件之間的各種資訊傳送。
-系統匯流排包括地址匯流排、資料匯流排和控制匯流排三組。它們分別用於傳送不同的資訊。

Intel 8086/8088 CPU的功能結構

CPU執行指令序列就是重複執行以下兩個步驟:

  • 從儲存器中取指令
  • 執行指令規定的操作

這兩個步驟的執行又分為序列方式和指令流水線方式。

  1. 序列方式
    (1)當CPU在指令執行階段,不需要佔用系統匯流排,但此時匯流排也不工作,因此係統匯流排的空閒時間比較多 。
    (2)在從儲存器取指令、取資料或存資料時,匯流排處於忙狀態,其所佔用的時間也較長。而CPU卻只需要花很短的時間去處理,因此大部分時間處於閒置狀態。
    採用序列工作方式的計算機其執行速度較慢

  2. 指令流水線方式
    採用指令流水線工作方式的計算機具有較高的工作效率。CPU內部採用了一種先進的指令流水線結構,這種結構可以有效而充分地利用各主要硬體資源。
    要實現指令流水線方式,從CPU組成結構上要劃分成多個單元。8086/8088CPU被劃分成兩個單元。

1. 執行單元EU
EU的主要任務是分析與執行指令,具體包括:

A、從指令佇列中取出指令程式碼,由控制器譯碼後產生 相應的控制訊號,控制各部件完成指令規足的操作。
B、對運算元執行各種指定的算術或邏輯運算。
C、向匯流排介面單元BIU傳送訪問主存或I/O的命令,並 提供相應的地址和傳送的資料。

2. 匯流排介面單元BIU
BIU負責CPU與儲存器、I/O的資訊傳送。具體包括:

A、取指令——根據CS暫存器和指令指標IP形成20位的物 理地址,從相應的儲存器單元中取出指令,暫存到指令隊 列中,等待EU取走並執行。
B、存取資料——在EU執行指令的過程中,需要與儲存器 或I/O埠傳送資料時,由EU提供的資料和地址,結合段 暫存器,通過系統匯流排與儲存器或I/O進行資料的存取。

EU和BIU是既分工又合作的兩個獨立部分。它們的操 作在一定程度上是並行工作的,分別完成不同的任務,從 而大大加快了指令執行速度。


Intel 8086/8088CPU暫存器結構及其用途

一、通用暫存器

Intel 8086/8088有8個16位通用暫存器,它們具有良好 的通用性,並且還可以用作某個特定的功能,可以由程式 設計人員進行程式設計訪問。
1. 資料暫存器

它包括AX、BX、CX和DX四個暫存器。它們中的每一 個既可以是16位暫存器,也可以分成兩個8位暫存器使用。 即可以當作8個獨立的8位暫存器使用。
資料暫存器既可以用來存放參加運算的運算元,也可以 存放運算的結果。在多數情況下,使用這些暫存器時必須在 指令中明確指示。

在有些指令中,不需要明確指出使用的暫存器名,即 隱念使用了某暫存器,稱為隱含使用。
個別指令對暫存器有特定的使用,並且又必須在指令中 指明它的名字,這類暫存器的使用稱為特定使用。

2. 指標暫存器

指標暫存器有堆疊指標SP和基址指標BP
它們一般被用來存放16位地址,在形成20位的物理地 址時常被作為偏移量使用。

SP指標——在進行堆疊操作時,被隱含使用,被用來指向 堆疊頂部單元。
BP指標——被用來指向堆疊段內某一儲存單元。BP除用作 地址指標外也可以象資料暫存器一樣,存放參加運算的操 作數和運算的結果。

3. 變址暫存器
有兩個16位的變址暫存器SI和DL 一般被用來作地址指標。

SI——源變址暫存器	
DI—— 目的變址暫存器

同BP暫存器一樣,SI和DI也可以用作通用資料暫存器存放運算元和運算結果。

二、段暫存器

8086/8088CPU在使用儲存器時,將它劃分成若干個段。每個段用來存放不同目的內容。每個儲存段用一個段暫存器來指明該段的起始位置(也叫 段基址)。
CPU在訪問儲存器時必須指明兩個內容:

(1)所訪問的儲存單元屬於哪個段,即指明使用的段 暫存器。
(2)該儲存單元與段起始地址(段基址)相距多少, 即偏移量。

在程式設計中,一個程式將儲存器劃分成多少個存 儲段是任意的。但在程式執行的任何時刻最多隻有4個 段,分別由CS、DS、ES和SS指定。

三、指令指標IP

CPU在從儲存器取指令時,以段暫存器CS作為程式碼段的 基址指標,以IP的內容作為偏移量,共同形成一條指令 的存放地址。
當CPU從記憶體中取岀一條指令後,IP內容自動修改為指 向下一條指令。

注意:IP的內容不能被直接訪問,既不能用指令去讀IP 的值,也不能用指令給它賦值。但是可以通過某些指令的 執行而自動修改IP的內容。

  • 下面兩種指令可以自動改變IP暫存器的內容。

      轉移指令將指令中的目的地址的偏移量送入IP
      子程式呼叫指令CALL,將IP原有內容自動壓入堆疊, 而將子程式的入口地址偏移量自動送入IP,而返回指令 RET,又自動從堆疊中彈回原有IP的內容。
    

四、標誌暫存器

標誌暫存器是用來反映CPU在程式執行時的某些狀態, 如是否有進位、奇偶性、結果的符號、結果是否為零等等。
1. 進位標誌位CF

在進行算術運算時,若最高位(對字操作是第15位,位元組操作是第7位)產生進位或借位時CF被自動置“1”,否則置“0”
在移位類指令中,CF也被用來存放從最高位(左移時)或最 低位(右移時)移岀的數值(0或1) o

2. 奇偶標誌位PF

當指令操作結果的低8位中含有1的個數為偶數時,貝IJPF 被置1,否則PF被置0。

注意:PF只反映操作結果的低8位的奇偶性,與指令運算元的長度無關。

3. 輔助進位標誌位AF

在進行算術運算時,若低位元組的低四位向高4位產 生進位或借位,即第3位產生進位或借位時,AF位被置1, 否則置0。AF標誌位用於十進位制運算的調整。

注意:AF只反映運算結果低八位,與運算元長度無關。

4. 零值標誌位ZF

若運算結果各位全為0,貝IJZF被置1,否則置0。

5. 符號標誌位SF

將運算結果視為帶符號數,當運算結果為負數時SF 被置1,為正數時,則置0。
由於第7位是位元組運算元的符號位,而第15位是字操 作數的符號位,因此,SF位與運算結果的最高位(第7 位或第15位)相同。

6. 溢岀標誌位OF

當運算結果超過機器用補碼所能表示數的範圍時, 則OF置1,否則置0.
位元組資料,機器用補碼所能表示的數範圍為-128〜+127。 字資料的表示範圍為:-32768〜+32767

注意:溢岀與進位是兩個完全不同的概念,不能相互混淆。

7. 單步標誌位TF

單步標誌也叫跟蹤位,該標誌為控制標誌位。單步標誌 位供除錯程式使用。
當TF位被設定為1時,每執行一條指令後,CPU暫停運 行,即產生單步中斷。

8. 中斷允許標誌位IF

該標誌位為控制標誌位。當IF被設定為1時,CPU可以 響應可遮蔽中斷,否則不允許響應可遮蔽中斷。

9. 方向標誌位DF

DF也是控制標誌位。它被用來規定串操作指令的增減 方向。
當DF=O時,串操作指令自動使變址暫存器(SI和DI) 的內容遞増。當DF=1時,串操作指令自動使變址暫存器的 內容遞減。

儲存器組織結構

一、儲存器的組成

1. 儲存器是由若干個儲存單元構成儲存單元的多少就表示了儲存器的容量.
2. 每個儲存單元存放相同長度的二進位制數一個儲存單元的長度一般為8位二進位制數,即一個位元組。
3. 每個儲存單元有一個唯一的地址編號,簡稱地址。
4. 任何兩個相鄰位元組單元就構成一個字單元
一個字儲存單元(WORD)的長度為16位二進位制數,即兩個位元組。字單元的地址為兩個位元組單元中較小地址位元組單元的地址。16位長資料的存放規則是低8位放在較低地址位元組單元中,高8位放在較高地址位元組單元中。
5. 在定義一個地址時必須指岀是位元組或字型別屬性

二、儲存器的段結構

8086/8088系統的儲存器段結構具有以下幾個特點:

1. 8086/8088CPU將1MB的儲存空間劃分成若干個段,每 個段最大長度為64K (65536)個位元組單元組成。
2.每個段的基址(段基址)必須是一個小節的首址。
    段基址——一個段的起始地址。
    每個小節的首地址最低位必為0
3.邏輯段在物理儲存器中可以是鄰接的、間隔的、 部分重疊的和完全重疊的等4種情況。
4.在任一時刻,一個程式只能訪問4個當前段中的內容。
    4個當前段分別是程式碼段、資料段、堆疊段和附加段。

三、邏輯地址與實體地址及對應關係

1. 實體地址
在1MB的儲存空間中,每個儲存單元的實體地址是唯 一的,它就是該儲存單元的20位地址。
8086/8088的實體地址範圍:00000H〜0FFFFFH

2. 邏輯地址
在程式設計中,為了便於程式的開發和對儲存器進行動 態管理,使用了邏輯地址。
邏輯地址包括兩個部分:段基值和偏移量

段基值:存放在某一個段暫存器中,是一個邏輯段的起始 單元地址(段基址)的高16位。
偏移量:表示某個儲存單元與它所在段的段基址之間的字 節距離。

3. 邏輯地址轉換為實體地址
當CPU要訪問儲存器時,需要由匯流排介面單元BIU將邏輯地址轉換成實體地址

轉換方法:將邏輯地址的段基值左移4位,形成20位的段基址(低位為0)然後與16位的偏移量相加,結果即為20位的實體地址。

4.邏輯地址的來源
在程式的執行過程中,CPU根據不同操作型別訪問儲存器,其邏輯地址中段基值和偏移量的來源是不一樣的。


堆疊及其操作方法

堆疊是一個特定的儲存區,訪問該儲存區一般需要按 照專門的規則進行操作。
堆疊的用途:主要用於暫存資料以及在過程呼叫或處理 中斷時儲存斷點資訊。

一、堆疊的構造

堆疊一般分為:專用堆疊儲存器和軟體堆疊

專用堆疊儲存器:按堆疊的工作方式專門設計的儲存器
軟體堆疊:由程式設計人員用軟體在記憶體中劃岀的一塊儲存區 作為堆疊來使用。8086/8088釆用這種方式。

堆疊的一端是固定的,稱為棧底。棧底是堆疊儲存區的最大地址單元。
另一端是浮動的,稱為棧頂。在任何時刻,棧頂是最後存入 資訊的儲存單元。棧頂是隨著堆疊中存放資訊的多少而改變。
為了指示現在堆疊中存放資料位置,通常設定一個寄存 器SP來指示棧頂位置。SP的內容始終指向棧頂單元,堆疊中資料進岀都由SP來控制
在堆疊中存取資料的規則是:“先進後出FILO”。

二、8086/8088堆疊的組織

在8086/8088微機中堆疊是由堆疊段暫存器SS指示的一段儲存區。
頂由椎棧指標SP指示。
SP內容為最大(初始) 值時,表示堆疊為空。而當(SP) =0時,表示堆疊全滿。
通過改變堆疊段暫存器SS的內容,即可改變到另一個 堆疊段,當改變了堆疊段暫存器SS的內容後,必須緊接著 賦予SP新值。

三、堆疊操作

1. 設定堆疊

設定堆疊主要是對堆疊段暫存器SS和堆疊指標SP賦值。

2. 進棧PUSH

進棧就是把資料存入堆疊。由指令PUSH或者由機器自動 實現,可以將通用暫存器、段暫存器或字儲存單元的內容壓 入堆疊頂部。

進棧的執行過程:
(1)首先將堆疊指標SP減2,即指向一個空的堆疊字單元

  • SP<=(SP)-2

(2)將要儲存的內容(暫存器或儲存單元的內容)送入SP指向的字單元中。

  • (SP) v=資料

3. 岀棧POP

岀棧操作由POP指令或機器自動實現,它從堆疊頂 部弾出--個字到通用暫存器、段暫存器或字儲存單元。

岀棧的操作過程:
(1)將SP指向的字單元(即棧頂字單元)內容送往指定 的暫存器或儲存器。

  • 暫存器/儲存器v=((SP))

(2)堆疊指標SP內容加2,

  • SP<= (SP) +2

第三章 定址方式與指令系統

定址方式

—條指令通常由兩大部分構成:

操作碼表示該指令應完成的具體操作,如加法、減法、 乘法、移位等等。在組合語言中使用一定的符號來表示,稱 為助記符。如ADD、PUSH、POP、MOV等等。
運算元表示該指令的操作物件。如移位操作的被移位數, 加法操作的加數等等。它可以是一個運算元,也可以是多個 運算元。這取決於操作碼部分的具體需要。

Intel 8086/8088各指令中提供運算元的方法有以下四種:

(1)	立即數運算元——運算元在指令程式碼中提供
(2)	暫存器運算元——運算元在CPU的通用暫存器或 段暫存器中
(3)	儲存器運算元——運算元在記憶體的儲存單元中
(4)	I/O埠運算元——運算元在輸入/輸出介面的寄 存器中

1. 立即數定址
立即數定址方式的指令中,所需運算元直接包含在指令 程式碼中,這種運算元稱為立即數。
2. 暫存器定址
暫存器定址方式是指指令中所需的運算元在CPU的某個 暫存器中。暫存器可以是8位或16位通用暫存器,或者是段 暫存器。
3. 直接定址
在直接定址方式的指令中,運算元的有效地址EA只有 位移技地址分量。
(1)用符號表示
例:MOV BX, VAR =>MOV BX, DS: VAR 它表示將資料段中,偏移了VAR個位元組距離的字單元 內容送到暫存器BX中。
(2)用常數表示
例:MOV AX, DS: [64H]
它表示從當前資料段開始,偏移100個位元組的字單元內容 送到AX中。
注意:用常數表示時,必須用方括號括起來。段寄存 器不能省略。

4. 暫存器間接定址

運算元有效地址EA直接從基址暫存器(BX或BP)或 變址暫存器(SI或DI)中獲得。

5. 基址定址和變址定址
運算元的有效地址EA等於基地址分量或變址分量加上 指令中給出的位移量。
指令中使用BX或BP時為基址定址。指令中使用SI或DI時 為變址定址。

6. 基址變址定址
運算元的有效地址是三個地址分量之和,即:

  • EA=基址+變址+位移量

當基址選用BX時隱含使用段暫存器DS,而選用BP時 則隱含使用段暫存器SS。

7. 串操作定址方式

在尋找源運算元時,隱含使用SI作為地址指標。
在尋找目的串時,隱含使用DI作為地址指標。
在串操作完成之後,自動對SI和DI進行修改,使它們指 向下一個運算元。

8. I/O埠定址
(1)儲存器編址方法
將I/O埠視為儲存器的一個單元,對埠的訪問就如 同訪問儲存單元一樣。訪問儲存器的指令和各種定址方式 同樣適用對I/O埠的訪問。
特點:程式設計靈活,但需要佔用儲存地址空間。
(2) I/O埠編址方法
I/O埠的地址與儲存器地址分開,並使用專門的輸入指令和 輸出指令。

  • 直接埠定址
    在指令中直接給岀埠地址,埠地址一般採用2位十六進 制數,也可以用符號表示。
  • 暫存器間接埠定址
    暫存器間接埠定址:把I/O埠的地址先送到DX中,用 DX作間接定址暫存器。
    如果訪問的埠地址值大於255,則必須用I/O埠的間 接定址方式。

指令系統

一、傳送類指令

1. 通用資料傳送指令
指令格式:MOV DEST, SRC

當指令執行完後,目的運算元原有的內容被源運算元內 容覆蓋,即目的運算元和源運算元具有相同內容。

MOV指令在使用時需注意以下幾個問題:

(1)立即數只能作源運算元,且它不能傳送給段暫存器。
(2)段暫存器CS只能作源運算元,段暫存器之間不能直 接傳送。
(3)儲存單元之間不能直接傳送資料
(4) MOV指令不影響標誌位

2.交換指令
指令格式:XCHG DEST, SRC
作用:源運算元和目的運算元兩者內容相互交換。
指令對標誌暫存器各位無影響

資料交換可以在暫存器之間或暫存器與儲存器單元之 冋進行。但是不能在儲存單元之間直接進行資料交換。寄 存器只能使用通用暫存器。

3.標誌傳送指令
(1)取標誌暫存器指令

  • 指令格式:LAHF
  • 作用:將標誌暫存器的低8位送入AH暫存器,即將標誌
    SF、ZF、AF、PF和CF分別送入AH的第7、6、4、2、0 位,而AH的第5、3、1位不確定。

指令執行對標誌暫存器各位無影響,即標誌暫存器各位不變.

(2)儲存標誌暫存器指令

  • 指令格式:SAH F
  • 作用:將暫存器AH中的第7、6、4、2、0位分別送入標誌寄 存攜的SF、ZF、AF、PF和CF各標誌位。而標誌暫存器高8 位中的各標誌位不受影響。

(3)標誌進棧指令

  • 指令格式:PUSH F
  • 作用:先將堆疊指標SP減2,使其指向堆疊頂部的空字單元, 然後將16位標誌暫存器的內容送SP指向的字單元。

(4)標誌出棧指令

  • 指令格式:POP F
  • 作用:將由SP指向的堆疊頂部的一個字單元的內容送 入標誌暫存器,然後SP的內容加2

4.地址傳送指令

(1)裝入有效地址

  • 格式:LEA DEST, SRC
  • 作用:將SRC儲存單元地址中的偏移量,即有效地址EA 傳送到一個16位通用暫存器中。指令執行對標誌暫存器各位無影響。

(2)裝入地址指標指令

  • 格式:LDS DEST, SRC 
  •            LES DEST, SRC
  • 作用:把SRC儲存單元開始的4個位元組單元的內容 (32位地址指標)送入DEST通用暫存器和段暫存器 DS (LDS指令)或ES (LES指令),其中低字單 元內容為偏移量送通用暫存器,高字單元內容為段 基值送DS或ES。

二、算術運算類指令

1.加法指令

  • 指令格式:ADD DEST, SRC
  • 功能:目的運算元和源運算元和加,其和存放到 目的運算元中,而源運算元內容保持不變,即
    DEST<=(DEST)+(SRC)。

2.帶進位加法指令

  • 指令格式:ADC DEST, SRC
  • 該指令的功能與ADD基本相同,所不同的是其結果 還要加上進位標誌CF的值,即:
    DEST<=(DEST)+(SRC)+CF

3 .加1指令

  • 指令格式:INC DEST
  • 該指令為單運算元指令,其功能是將目的運算元加
    1,並送回到目的運算元,
    即:DEST<=(DEST)+1

4 .減法指令

  • 指令格式:SUB DEST, SRC
  • 功能:目的運算元的內容減去源運算元的內容,結果 送入目的運算元,源運算元中內容保持不變。
    即:DEST<= (DEST) — (SRC)

5 .帶借位減法

  • 指令格式:SBB DEST, SRC
  • 該指令的功能與SUB指令基本相同,不同的是在兩 個運算元相減後再減去進位標誌CF的值。
    即:DEST<=(DEST) —(SRC)—CF。

6.減1指令

  • 指令格式:DEC DEST
  • 該指令為單運算元指令,將目的運算元的內容減1 後,送回到目的運算元。
    即:DEST<=(DEST) —1

7.求負數指令

  • 指令格式:NEG DEST
  • 功能:用零減去目的運算元的內容,並送回目的操 作數。
    即:DEST<=0-(DEST)

三、位操作類指令

1.邏輯運算指令
邏輯運算指令共有4條,它們的指令格式分別是:
邏輯“與”指令 AND DEST,SRC
邏輯“或”指令 OR DEST,SRC
邏輯“異或”指令 XOR DEST,SRC
邏輯“非”指令 NOT DEST

DEST SRC AND OR XOR NOT
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0

2.測試指令

  • 指令格式:TEST DEST, SRC
  • 該指令的功能與AND指令相似,實現源運算元與 目的運算元進行按位“邏輯與"運算,對標誌位 的影響與AND指令相同,但運算的結果不送入目 的運算元,即目的運算元內容也將保持不變

3.移位/迴圈移位指令

(1)算術移位

算術左移 SAL DEST,COUNT
算術右移 SAR DEST,COUNT

(2)邏輯移位

邏輯左移 SHL DEST,COUNT
邏輯右移 SHR DEST,COUNT

(3)迴圈移位
小迴圈:

迴圈左移 ROL DEST,COUNT
迴圈右移 ROR DEST,COUNT

大迴圈:

帶進位迴圈左移 RCL DEST,COUNT
帶進位迴圈右移 RCR DEST,COUNT

四、處理器控制類指令

1. 標誌位操作指令
它們都是無運算元指令,運算元隱含為標誌暫存器的 某個標誌位。能直接操作的標誌位有CF、IF和DF。

(1)消除進位標誌 CLC ;置CF為0
(2)置1進位標誌 STC ;置CF為 1
(3)進位標誌取反 CMC ; CF的值取反
(4)清除方向標誌 CLD;置DF為0
(5)置1方向標誌 STD;置DF為 1
(6)清除中斷標誌 CLI;置IF為0
(7)置1中斷標誌 STI;置IF為 1

2. 與外部事件同步的指令

  • HLT ;暫停指令
  • WAIT ;等待指令
  • ESC ;外部協處理器指令字首
  • LOCK ;匯流排鎖定指令

3. 空操作指令NOP
執行一次NOP佔用CPU三個時鐘週期,它不改變任 何暫存器或儲存單元內容,主要用於延時。


指令編碼

一、雙運算元指令編碼格式

1. 操作特徵部分
這部分為指令編碼的首位元組,它又分為以下三個段。
(1) OPCODE:操作碼欄位
該欄位長度為6bit。它表示了該指令所執行的功能 和兩個運算元的來源。
(2)方向欄位d
該欄位與第2部分定址特徵一起來決定源運算元和 目的運算元的來源。
(3)字/位元組欄位W
當W=1時,表示兩運算元長度為字;當W=0時,表 示兩運算元長度為位元組。

2. 定址特徵部分

  • 當d=l時,則目的運算元由REG欄位確定,而源操作 數由MOD和R/M欄位確定o
  • 當d=0時,則目的運算元由MOD和R/M欄位確定,而 源運算元由REG欄位確定。

(1) REG欄位
由REG欄位確定的一個運算元是某一通用暫存器的 內容,即使用的是暫存器定址方式。

REG 000 001 010 011
段暫存器 ES CS SS DS

(2)定址方式欄位MOD和暫存器/儲存器欄位R/M

這兩個欄位共同確定一個運算元。該運算元可以 在暫存器中,也可以在儲存器中

3. 位移量部分

根據定址特徵中MOD和R/M欄位確定的有效地址 計算方法,位移量可以是以下三種情況之一:

  • 沒有位移量
  • 1位元組位移量disp8
  • 2位元組位移量displ6

4. 立即數部分

如果指令的源運算元為立即數,則指令編碼中包含 有該部分。它總是位於指令編碼的最後1〜2位元組。

二、單運算元指令編碼格式

這種編碼格式適用於只有一個運算元的指令,如INC、 DEC、移位/迴圈等指令。指令編碼為2〜3位元組。

操作特徵部分:
包括OPCODE、V和W三個欄位,其中V欄位只有移位/ 迴圈指令中才有該欄位。其它指令中沒有該欄位。

  • V=0時,指令中使用常數1作為移位或迴圈次數。
  • V=1時,指令中使用暫存器CL作移位次數。
    由於單運算元指令中只有一個運算元,因此定址特徵部分就不需要REG欄位,而該欄位被用作輔助操作碼。

三、與AX或AL有關的指令編碼格式

這種編碼格式用於隱含指定AX/AL作為一個運算元 的雙運算元指令。
採用這種編碼格式的指令,除一個運算元隱含指定為 AX/AL外,另一個運算元可以是立即數或儲存單元。
立即數:則編碼中應有1〜2位元組的立即數
儲存單元:只能使用直接定址方式,位 移量由disp欄位給岀。

四、其它指令編碼格式

除上述三種編碼格式外,還有一些指令的編碼格式更簡單。如標誌位操作指令、堆疊操作指令等。 這些指令的編碼格式一般只有一個位元組。



第四章 組合語言程式格式

組合語言語句種類及其格式

一、指令語句

1 .標號欄位

  • 標號是可選欄位,它後面必須有“:”標號是一 條指令的符號地址,代表了該指令的第一個位元組存放地址。
  • 標號一般放在一個程式段或子程式的入口處,控制 程式的執行轉到該程式位置。
  • 例 ADDR1: MOV AL, 100

2 .指令助記符欄位

  • 該欄位是一條指令的必選項,它表示這條語句要求 CPU完成什麼具體操作,如MOV、ADD、SHL等。
  • 有些指令還可以在指令助記符的前面加上字首,實 現一定的附加操作。

3.運算元欄位

  • 一條指令可以有一個運算元、兩個運算元或者無運算元。

4.註釋欄位

  • 註釋欄位為可選項,該欄位以分號“;”開始。
  • 它的作用是為閱讀程式的人加上一些說明性內容
  • 註釋欄位不會產生機器目的碼,它不會影響程 序和指令的功能。
  • 註釋欄位可以是一條指令的後面部分,也可以是 整個語句行。

二、偽指令語句

偽指令語句又叫命令語句
偽指令本身並不產生對應的機器目的碼。它僅 僅是告訴彙編程式對其後面的指令語句和偽指令 語句的運算元應該如何處理。

1.符號名欄位

  • 該欄位為可選項。根據偽指令的不同,符號名可 以是常量名、變數名、過程名、結構名和記錄名
  • 一條偽指令語句的符號名可以作其它偽指令語句 或指令語句的運算元,這時它表示一個常量或儲存器地址

2.偽指令符欄位

  • 該欄位是偽指令語句的必選項,它規定了彙編 程式所要完成的具體操作。

3.運算元欄位

  • 該欄位是否需要,以及需要幾個是由偽指令符 欄位來決定。
  • 運算元可以是一個常數

4.註釋欄位

  • 註釋欄位為可選項,該欄位必須以分號開始。 其作用與指令語句的註釋欄位相同。

三、識別符號

指令語句中的標號利偽指令語句中符號名統 稱為識別符號。識別符號是由若干個字元構成的。
識別符號構成規則:
1.字元的個數為1〜31個;
2.第一個字元必須是字母、問號、@或下劃線“” 這4種字元之一;
3.從第二個字元開始,可以是字母、數字、@、“

或問號“?”;
4.不能使用屬於系統專用的保留字。


組合語言資料

在組合語言中常用的資料形式有:常數、變 量和標號

一、常數

常數有以下幾種形式:

1.二進位制數:以字母B結尾。
2.八進位制數:以字母O或Q結尾。
3.十進位制數:以字母D結尾,或者沒有結尾字 母。
4.十六進位制數:以字母H結尾,如果常數的第一個數字為字母,為了與識別符號加以區別,必須在其前面冠以數字“0”。
5.實數。
6.字串常數:用引號(單引號或雙引號)括起 來的一個或多個字元,這些字元以它的ASCII碼 值儲存在記憶體。

常數在程式中可以用在以下幾種情況:

(1)作指令語句的源運算元
(2)在指令語句的直接定址方式、變址(基址)尋 址方式或基址變址定址方式中作位移量。
(3)在資料定義偽指令中使用

二、變數

1.變數的定義與預置
定義變數就是給變數在記憶體中分配一定的儲存單 元。也就是給這個儲存單元賦與一個符號名,即變數 名,同時還要將這些儲存單元預置初值。
變數定義的一般格式:

定義變數 含義
DB 定義位元組變數
DW 定義字變數
DD 表示式1,表示式2... 定義4位元組變數
DQ 定義8位元組變數
DT 定義10位元組變數

其中表達式1、表示式2是給儲存單元賦的初值。

當變數被定義後,就具有了以下三個屬性:
(1)段屬性
它表示變數存放在哪一個邏輯段中。
(2)偏移量屬性(OFFSET)
它表示變數所在位置與段起始點之間的位元組數。
段屬性和偏移量屬性就構造了變數的邏輯地址
(3)型別屬性
它表示變數佔用儲存單元的位元組數。

在變數的定義語句中,給變數賦初值的表示式可以使 用下面4種形式:
(1)數值表示式

  • 例如:DATA1 DB 32, 30H

(2) ?表示式

  • 不帯引號的問號“?"表示可以預置任意內容。

(3)字串表示式

  • 對於DB偽指令,字串為用引號括起來的不超過255 個字元。給每一個字元分配一個位元組單元。字串按從左 到右,將字元的ASCII編碼值以地址遞增的排列順序依次 存放。

(4) DUP表示式

  • DUP稱為重複資料操作符。
  • 格式:
    變數名 DW/DB/DD 表示式1 DUP (表示式2)

其中:表示式1是重複的次數,表示式2是重複的內容。

2.變數的使用
(1)在指令語句中引用

  • 在指令語句中直接引用變數名就是對其儲存單元的內容進 行存取
  • 當變量出現在變址(基址)定址或基址變址定址的運算元 中時表示取用該變數的偏移量。

(2)在偽指令語句中引用

三、標號

  • 標號寫在一條指令的前面,它就是該指令在記憶體的 存放地址的符號表示,也就是指令地址的別名。
  • 標號主要用在程式中需要改變程式的執行順序時, 用來標記轉移的目的地,即作轉移指令的運算元。

每個標號具有三屬性

(1)段屬性(SEG)
它表示該標號所代表的地址在娜個邏輯段中,即段基值。
(2)偏移量屬性(OFFSET)
它表示該標號所代表的地址在段內與段起點間的位元組 數,即地址的偏移量。
(3)距離屬性(也叫型別屬性)
它表示該標號可以被段內還是段間的指令呼叫。

  • NEAR (近): 該標號只能作段內轉移,也就是說只能
    是與該標號所指指令同在一個邏輯段的轉移指令和 呼叫指令才能使用它。
  • FAR (遠): 該標號可以被非本段的轉移和呼叫指令使用。
    標號的距離屬性可以右兩種方法來指定:
    a.隱含方式
    b.用LABEL偽指令給標號指定距離屬性

符號定義語句

一、等值語句

語句格式:符號名 EQU 表示式

  • 功能:用符號名來表示EQU右邊的表示式。後面的程式中 一旦岀現該符號名,彙編程式將把它替換成該表示式。
    表示式可以是任何形式,常見的以下:

1.常數或數值表示式
COUNT EQU 5
NUM EQU COUNT+5
2 .地址表示式
ADRI EQU DS: [BP+14]
ADRI被定義為在DS資料段中以BP作基址定址的一個 儲存單元。
3.變數、暫存器名或指令助記符

二、等號語句

格式:符號名 =表示式
-等號語句與等值語句具有相同的作用。但等號語句可以 對一個符號進行多次定義。


表示式與運算子

表示式是指令或偽指令語句運算元的常見形式。它由 常數、變數、標號等通過操作運算子連線而成。

一、算術運算子

+、-、*、/、MOD、SHL、SHR、[]

1.運算子“+”和“-”也可作單目運算子,表示數的正負。
2. 使用“+”、“-”、“*”、和“/”運算子時,參加運算 的數和運算結果都是整數
3.“/”運算為取商的整數部分,而“MOD”運算取除法運 算的餘數。
4.“SHR ”和“SHL ”為邏輯移位運算子
“SHR”為右移,左邊移出來的空位用0補入
“SHL”為左移,右邊移出來的空位用0補入
5.下標運算子“[]”具有相加的作用
一般使用格式: 表示式1 [表示式2]

二、邏輯運算子

邏輯運算子有NOT、AND、OR和XOR等四個,它們執 行的都是按位邏輯運算。

三、關係運算符

關係運算符包括:

運算子 含義
EQ 等於
NE 不等於
LT 小 於
LE 小於等於
GT 大於
GE 大於等於

關係運算的結果只能是**“真”(全1)或“假”(全0)**

四、數值返回運算子

1.SEG運算子
作用:取變數或標號所在段的段基值。

2.OFFSET運算子
該運算子的作用是取變數或標號在段內的偏移量。

3.TYPE運算子
作用:取變數或標號的型別屬性, 來說就是取它的位元組長度。

4.LENGTH運算子
該運算子用於取變數的長度
>如果變數是用重複資料操作符DUP說明的,則LENGTH運 算取外層DUP給定的值。
>如果沒有用DUP說明,貝0LENGTH運算返回值總是1。

5.SIZE運算子
該運算子只能作用於變數,SIZE取值等於LENGTH和 TYPE兩個運算子返回值的乘積。

五、屬性修改運算子

1.PTR運算子

  • 使用格式: 型別PTR地址表示式
  • 作用:將地址表示式所指定的標號、變數或用其它形式表 示的儲存器地址的型別屬性修改為“型別”所指的值。
    型別可以是BYTE、WORD、DWORD、NEAR和FAR。 這種修改是臨時的,只在含有該運算子的語句內有效。

2.HIGH/LOW 運算子

  • 使用格式:HIGH表示式 
  •                   LOW表示式
  • 這兩個運算子用來將表示式的偵分離出高位元組和低位元組。

注意:HIGH/LOW運算子不能用來分離一個變數、寄 存器或儲存器單元的高位元組與低位元組。

3.THIS運算子

  • THIS運算子一般與等值運算子EQU連用,用來定 義一個變數或標號的型別屬性。所定義的變數或標號的
    段基值利偏移量與緊跟其後的變數或標號相同。
六、運算子的優先順序

在一個表示式中如果存在多個運算子時,在計算時就有先 後順序問題。不同的運算子具有不同的運算優先級別。

優先級別 運算子
(最高)1 LENGTH, SIZE ,圓括號
2 PTR, OFFSET, SEG, TYPE, THIS
3 HIGH, LOW
4 *, /, MOD, SHR, SHL
5 + ,-
6 EQ, NE, LT, LE, GT, GE
7 NOT
8 AND
(最低)9 OR, XOR

彙編程式在計算表示式時,按以下規則進行運算:

  • 先執行優先級別高的運算,再算較低級別運算;
  • 相同優先級別的操作,按照在表示式中的順序,從 左到右進行;
  • 可以用圖括號改變運算的順序。

程式的段結構

一、段定義偽指令
  • 偽指令SEGMENT和ENDS用於定義一個邏輯段。使 用時必須配對,分別表示定義的開始與結束。
  • 格式:
    段名SEGMENT [定位型別][組合型別]『'類別名']
    ......本段語句序列
    段名ENDS

1、段名

  • 段名是使用者自己任意選定的,符合識別符號定義 規則的一個名稱。
  • 最好選用與該邏輯段用途相關的名稱。如第--個數 據段為DATA1,第二個資料為DATA2等。
  • 一個段的升始與結尾用的段名必須-致。

2、定位型別

(1)PAGE:表示該段從一個頁面的邊界開始
由於一個頁面為256個位元組,並且頁面編號從0開始,因此, PAGE定位型別的段起始地址的最後8位二進位制數一定為0, 即以00H結尾的地址。
(2)PARA:表示該段從一個小節的邊界開始
如果使用者未選定位型別,則預設為PARA。
(3) WORD:表示該段從一個偶數字節地址開始,即段起始 單元地址的最後一位二進位制數一定是0。
(4) BYTE:表示該段起始單元地址可以是任一地址值。
注意:定位型別為PAGE和PARA時,段起始地址與段基址 相同。定位型別為WORD和BYTE時,段起始地址與段基址 可能不同。

3、組合型別

(1)若未指定組合型別,表示本段與其它段無連線關係。在 裝入記憶體時,本段有自己的物理段,因此有自己的段基址
(2) PUBLIC:在滿足定位型別的前提下,將與該段同名的 段鄰接在一起,形成一個新的邏輯段,共用一個段基址。段 內的所有偏移量調整為相對於新邏輯段的段基址。
(3) COMMON:產生一個覆蓋段。在多個模組連線時,把 該段與其它也用COMMON說明的同名段置成相同的段基址, 這樣可達到共享同一儲存區。共享儲存區的長度由同名段中 最大的段確定。
(4) STACK:把所有同名段連線成一個連續段,且系統自動 對SS段暫存器初始化為該連續段的段基址。並初始化堆疊指 針SP
使用者程式中應至少有一個段用STACK說明,否則需要用 戶程式自己初始化SS和SP。
(5) AT表示式:表示本段可定位在表示式所指示的小節邊界上。表示式的值也就是段基值。
(6) MEMORY:表示本段在儲存器中應定位在所有其它段之 後的最高地址上。如果有多個用MEMORY說明的段,則只處 理第一個用MEMORY說明的段。其餘的被視為COMMON

4.類別名

  • 類別名為某一個段或幾個相同型別段設定的型別名稱。系 統在進行連線處理時,把類別名相同的段存放在相鄰的儲存 區,但段的劃分與使用仍按原來的設定。
  • 類別名必須用單引號引起來。所用字串可任意選定,
二、段定址偽指令
  • 段定址偽指令ASSUME的作用是告訴彙編程式,在處理源 程式時,定義的段與哪個暫存器關聯。
  • 一般格式:ASSUME段暫存器名:段名,段暫存器名:段名,..
三、段暫存器的裝入

1、DS和ES的裝入
在程式中,使用資料傳送語句來實現對DS和ES的裝入。

2、SS的裝入
SS的裝入有兩種方法

(1)在段定義偽指令的組合型別項中,使用STACK參 數,並在段定址偽指令ASSUME語句中把該段與SS段寄 存器關聯。
(2)如果在段定義偽指令的組合型別中,未使用STACK 引數,或者是在程式中要調換到另一個堆疊,這時,可以 使用類似於DS和ES的裝入方法。

3、CS的裝入

裝入CS和IP一般有下面兩種情況。

(1)由系統軟體按照結束偽指令指定的地址裝入初始的CS和IP

(2)在程式執行期間,當執行某些指令時,CPU自動修改 CS和IP,使它們指向新的程式碼段。


過程定義偽指令(PROC/ENDP)

過程定義偽指令格式如下:
過程名 PROC [NEAR/FAR]
...
RET
...
過程名ENDP

  • 過程名是子程式的名稱,它被用作過程呼叫指令CALL的目的運算元。

當前位置計數器$與定位偽指令ORG(Origin)

  • 定位偽指令ORG ——用來改變位置計數器的值。
  • 格式:ORG 數值表示式
  • 作用:將數值表示式的值賦給當前位置計數器$。ORG語 句為其後的資料或指令設定起始偏移量。
  • 表示式的值必須為正值。表示式中也可以包含有當前 位置計數器的現行值$。

標題偽指令TITLE

  • 語句格式:TITLE 標題名
  • 作用:給所在程式指定一個標題。以便在列表檔案的每一頁 的第一行都顯示這個標題。其中標題是使用者任意選用的字元 串,字元個數不能超過60。

從程式返回作業系統的方法

一、使用程式段字首PSP (Program Segment Prefix)實現返回

1.將使用者程式編製成一個過程,型別為FAR;
2.將PSP的起始邏輯地址壓棧,即將INT 20H指令的地址壓棧;
3.在使用者程式結尾處,使用一條RET指令。執行該指令將使 儲存在堆疊中的PSP的起始地址彈出到CS和IP中。
程式結構:

DATA SEGMENT
…
DATA ENDS
STACK1 SEGMENT STACK
…
STACK1 ENDS  CODE SEGMENT  BEGIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACK1  PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA  MOV DS,AX
…
RET  BEGIN ENDP  CODE ENDS
END BEGIN

二、使用DOS系統功能呼叫實現返回

執行DOS功能呼叫4CH,也可以控制使用者程式結束, 並返回DOS作業系統。
在程式結束時,使用兩條指令:
MOV AH, 4CH INT 21H
程式碼段的結構為:

CODE SEGMENT
ASSUME CS:CODE	
BEGIN:MOV AX, DATA
MOV DS, AX
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN


學習體會

組合語言既是最低階的語言也是最底層的,與我們計算機內部的結構聯絡十分密切,而且在《組合語言程式設計》這門課前四章的學習中也深刻的瞭解到了這一點。比如說暫存器、中斷、還要各種定址方式以及進棧出棧,好多的都是和計算機硬體有關。前面幾章都是對計算機內部結構和一些常用的指令以及定址方式的講解。

但只通過幾天淺顯的學習組合語言,感覺對於所學的知識點掌握程度並不是很良好,總有一種抓不住重點的感覺。希望在接下來的學習中能學以致用。