1. 程式人生 > 其它 >20192427李睿智組合語言學習筆記(1-4章)

20192427李睿智組合語言學習筆記(1-4章)

第一章 基礎知識

1.1 組合語言的一般概念

  • 計算機程式設計語言可分為機器語言、高階
    語言和組合語言
    三類

1.機器語言

1)機器語言就是把控制計算機的命令各種資料直接用二進位制數碼表示的一種程式設計語言。

在32位二進位制數表示的機器語言程式程式碼中,包含了乘法和加法運算操作,其中前16位程式碼表示了乘法運算,後16位程式碼表示了加法運算。

2)機器指令中既包含了指示運算功能的程式碼,又給出了參加運算的操作資料,表示非常詳細。

優缺點:

優點:機器語言最直接地表示了計算機內部的基本操作,用它編制的程式在計算機中執行的效率最高。即執行速度最快,==程式長度最短
缺點:用二進位制數表示的內容既不便於記憶又難於閱讀

2.高階語言

1)高階語言將計算機內部的操作細節遮蔽起來,使用者不需要知道計算機內部資料的傳送和處理的細節,使用類似於自然語言的一些語句來編制程式,完成指定的任務。

特點:

程式設計簡單,但程式效率較機器語言低。

3.組合語言

1)為了便於記憶和閱讀,使用字母和符號來表示機器語言的命令,用十進位制數或十六進位制數來表示資料,這樣的計算機程式設計語言就稱為組合語言。
2) 組合語言程式與機器語言程式的關係

一條組合語言的語句與一條機器語言指令對應
組合語言程式與機器語言程式效率相同.

3)不同型別計算機有不同的機器指令系統和組合語言描述

對一臺計算機來說,機器語言的執行主要取決於該計算機的中央處理器CPU

。因此熟悉計算機內部結構主要是指CPU的功能結構


1.2 學習和使用匯編語言的目的

  • 學習和使用匯編語言可以從根本上認識、理解計算機的工作過程。
  • 在計算機系統中,某些功能必須用匯編語言程式來實現。
  • 組合語言程式的效率高於高階語言程式。

1.3 進位計數制及其相互轉換

1)進位計數制:

  • 使用一定個數的數碼的組合來表示數字,這種表示方法稱為進位計數制。根據所使用的數碼的個數,就產生了不同的進位計數制。
  • 將各個位置上所表示的基本數值稱為位權, 簡稱
  • 不同的進位制和不同的位置其位權是不同的。位權乘以對應位置上的數碼就等於該數位上數值的大小。
  • 每個數位上能使用不同數碼的個數稱為基數
  • 每個數位能取的最大數碼值=基數-1。

    在計算機中資料表示一般採用二進位制數,因為它在計算機中最容易表示和儲存,且適合於邏輯值的表達與運算。)
  • 二進位制與8進位制、16進位制之間有非常簡單的轉換關係:3位二進位制數與一位8進位制數對應,4位二進位制數與一位16進位制數對應。
  • 在書寫不同進位計數制數時,為了區別,常在數的尾部用一個字母來表示:

B(Binary)--二進位制數

O (Octal)或Q--八進位制數

D (Decimal)--十進位制數

H (Hexadecimal)--十六進位制數。

如未使用任何字母,則預設表示是十進位制數。

2)各種數制間的相互轉換

1. 十進位制整數轉換為二進位制數
兩種轉換方法 :

(1)減權定位法

  • 從二進位制數高位起,依次用待轉換的十進位制數與各位權值進行比較;
  • 如夠減,則該數位係數Ki=1,同時減去該位權值,餘數作為下一次比較的值;
  • 如不夠減,則Ki=0 。

(2)除基取餘法

  • 將十進位制數除以基數2,其餘數為二進位制數的最低位,再用其商除2,其餘數為次低位,反覆做下去,直到商0.

2.十進位制小數轉換為二進位制數

(1)減權定位法:
轉換時應根據程式要求的精度或計算機的字長來確定二進位制的位數.

(2)乘積取整法

3.二進位制整數轉換為十進位制數

(1)按權相加法

(2)逐次乘基相加法

4.二進位制小數轉換為十進位制數

(1)按權相加法

(2)逐次除基相加法

5.二進位制與八進位制和十六進位制間的轉

二進位制與八進位制和十六進位制之間的對應關係很簡單:
三位二進位制數對應一位八進位制數,四位二進位制數對應一位十六進位制數


1.4帶符號數的表示

  • 在一般算術表示中使用”“+”和“-”來表示正數與負數,而在計算機中使用“0”和“1”來表示正數和負數。
  • 用“+”或“-”表示正負的數叫
    真值
    用“0”或“1”表示正負的數叫機器 帶符號的機器數可以用原碼、反碼和補碼三種不同碼制來 數 表示。一般計算機中大多采用補碼錶示。

一,原碼錶示

  • 二進位制數的最高位表示符號,0表示正,1表示負。數值部分用二進位制數絕對值表示。

  • 8位二進位制數原碼的

最大數為01111111(+127)

最小數為11111111 (-127)

8位二進位制數表示範圍:-127≤X≤+127

  • 0的原碼有兩種表示形式:00000000和10000000(+0和-0)

二,補碼的表示

  • 補碼的定義

帶符號數X的補碼錶示[X]補定義為:

[X]補=M+X (Mod M)

其中模數M根據機器數的位數而定,如位數為8則M=28用補碼錶示的機器數,符號位仍然表示數的符號:0為正,1為
負。對於正數,補碼與原碼相同,對於負數需要進行變換。

  • 由真值,原碼變換為補碼

由於正數的原碼與補碼相同,下面討論負數的變換方法。

負數的真值變換為補碼的方法:將各位變反(0變1,1變0)然後在最低位加1.

負數的原碼變換為補碼:保持符號位不變,其餘各位變反,最低位加1。

  • 補碼數的表示範圍

當位數為8時,

最大補碼為01111111=[+127]補

最小補碼為10000000=[-128]補

0的補碼只有一個,
[0]補=00000000,而10000000是[-128]補

11111111=[-1]補

對於16位數,則補碼錶示範圍為-32768~+32767

  • 補碼的加減運算

規則:

[X+Y]補=[X]補+[Y]補

[X-Y]補=[X]補-[Y]補=[X]補+[-Y]補

其中[-Y]補是對[Y]補執行一次求補運算

求補運算是將原數連同符號位一起(不管是正還是負)按位求反,再在最低位加1。

(1)加法運算:

X+Y

[X]補+[Y]補

(2)減法運算:

[X]補-[Y]補=[X]補+[-Y]補


1.5字元的表示

  • 在計算機內部,各種字元(字母、符號、數字碼)都是按一定的方式編寫成二進位制資訊。不同的計算機以及不同的場合所採用的編碼形式可能不同。目前最廣泛採用的是ASCII碼
  • 標準ASCII碼共有128個,可分為兩類:

非列印ASCII碼,共33個,用於控制操作, 如BEL(響鈴07H),DEL(刪除7FH),CR(回車,0DH), LF(換行,0AH).

可列印ASCII碼共有95個,如數字符0~9,大小寫字母等。


1.6基本邏輯運算

  • 計算機內部採用二進位制數表示資訊,具有物理實現容易、可靠性高的優點,且由於狀態“0”和“1”正好與邏輯運算中的邏輯“真”和“假”對應,因此可以用“0”和“1”來表示邏輯變數的取值,很容易地實現各種複雜的邏輯運算。
1. “與”運算

F=A ∧ B 或 F=A · B

0 ∧ 0 =0 0 ∧ 1 = 0 1 ∧ 0 = 0 1 ∧ 1 =1

2.“或”運算

F=A ∨B F=A +B

0 ∨0=0 0 ∨1=1 1 ∨0=1 1 ∨1=1

3.“非”運算

如A為1,則 非A=0,若A為0,則非A=1

非 1 = 0 非 0 = 1

4.“異或”運算

F =A ⊕ B

1 ⊕ 1=0 1 ⊕ 0=1 0 ⊕ 1=1 0⊕ 0=0



第二章 IBM-PC微機的功能結構

2.1 IBM-PC微機基本結構

一,微機的一般構成

運算器、控制器、儲存器、輸入裝置和輸出裝置。

  • 將運算器和控制器兩大部件整合在一個積體電路晶片上,稱為中央處理器 ,簡稱CPU,也叫微處理器
  • 系統採用匯流排結構,具有較大的靈活性和擴充套件性。
1,中央處理器CPU

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

2,主儲存器
  • 主儲存器是用來存放程式和資料的部件。它由若干個儲存單元構成。
  • 儲存單元的多少表示儲存器的容量。每個儲存單元使用一個唯一的編號來標識,稱為儲存單元的地址。
  • 對每個儲存單元內容的存和取是按照地址進行訪問的。
  • 習慣上將CPU與主儲存器合稱為主機
  • 在計算機中,除了主儲存器之外,一般還配置有輔助儲存器,簡稱輔存。由於它的位置是在主機之外,因此也叫做外存
3,輸入輸出裝置及介面
  • 輸入裝置將外部資訊(程式、資料和命令)送入計算機。包括鍵盤、滑鼠等
  • 輸出裝置將計算機處理後的結果轉換為人或其它系統能識別的資訊形式向外輸出。如顯示器、印表機等
  • 有的裝置既具有輸入功能又具有輸出功能。如磁碟、磁帶、觸控顯示屏等。
  • 由於I/O裝置的工作速度、工作原理以及所處理的資訊格式等與主機相差很大,因此I/O裝置要通過I/O接口才能與系統匯流排連線。
  • I/O介面是主機與I/O裝置之間設定的邏輯控制部件。通過它實現主機與I/O裝置間的資訊傳送。
4,系統匯流排
  • 系統匯流排將CPU、儲存器和I/O裝置連線起來,實現各大部件之間的各種資訊傳送。
  • 系統匯流排包括地址匯流排資料匯流排控制匯流排三組。
    它們分別用於傳送不同的資訊。

二,Intel 8086/8088 CPU的功能結構

  • 組合語言程式是由一系列的指令(指令序列)構成。
  • 指令是構成組合語言程式的最基本單位,就象高階語言中的語句。
  • CPU執行指令序列就是重複執行以下兩個步驟:

從儲存器中取指令

執行指令規定的操作

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

1)序列方式
特點

(1)當CPU在指令執行階段,不需要佔用系統匯流排,但此時匯流排也不工作,因此係統匯流排的空閒時間比較多 。

(2)在從儲存器取指令、取資料或存資料時,匯流排處於忙狀態,其所佔用的時間也較長。而CPU卻只需要花很短的
時間去處理,因此大部分時間處於閒置狀態。

採用序列工作方式的計算機其執行速度較慢

2)指令流水線方式:特點

(1)採用指令流水線工作方式的計算機具有較高的工作效率。CPU內部採用了一種先進的指令流水線結構,這種結構
可以有效而充分地利用各主要硬體資源。

8086CPU

(1)執行單元EU

EU的主要任務是分析與執行指令

(2)匯流排介面單元BIU

BIU負責CPU與儲存器、I/O的資訊傳送

2.2 Intel8086/8088CPU暫存器結構及其用途

一,通用暫存器

1,資料暫存器

它包括AX、BX、CX和DX四個暫存器。它們中的每一
個既可以是16位暫存器,也可以分成兩個8位暫存器使用。即可以當作8個獨立的8位暫存器使用。

資料暫存器既可以用來存放參加運算的運算元,也可以存放運算的結果。在多數情況下,使用這些暫存器時必須在
指令中明確指示。

2,指標暫存器

指標暫存器有堆疊指標SP和基址指標BP

sp指標

在進行堆疊操作時,被隱含使用,被用來指向
堆疊頂部單元。

BP指標

被用來指向堆疊段內某一儲存單元。BP除用作地址指標外也可以象資料暫存器一 樣,存放參加運算的運算元和運算的結果。

3,變址暫存器

有兩個16位的變址暫存器SI和DI,一般被用來作地址指標

SI——源變址暫存器

DI——目的變址暫存器

二,段暫存器

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

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

三,指令指標IP

  • CPU在從儲存器取指令時,以段暫存器CS作為程式碼段的基址指標,以IP的內容作為偏移量,共同形成一條指令的存放地址。
  • 當CPU從記憶體中取出一條指令後,IP內容自動修改為指向下一條指令。
注意:IP的內容不能被直接訪問,既不能用指令去讀IP的值,也不能用指令給它賦值。但是可以通過某些指令的執行而自動修改IP的內容。

四,標誌暫存器

  • 標誌暫存器是用來反映CPU在程式執行時的某些狀態,如是否有進位、奇偶性、結果的符號、結果是否為零等等。
1,進位標誌位CF
  • 在進行算術運算時,若最高位(對字操作是第15位,位元組操作是第7位)產生進位或借位時CF被自動置“1”,否則置“0”
  • 在移位類指令中,CF也被用來存放從最高位(左移時)或最低位(右移時)移出的數值(0或1)。
2,奇偶標誌位PF
  • 當指令操作結果的低8位中含有1的個數為偶數時,則PF被置1,否則PF被置0。
注意:PF只反映操作結果的低8位的奇偶性,與指令運算元的長度無關。
3,輔助進位標誌位AF
  • 在進行算術運算時,若低位元組的低四位向高4位產生進位或借位,即第3位產生進位或借位時,AF位被置1,否則置0。AF標誌位用於十進位制運算的調整。
注意:AF只反映運算結果低八位,與運算元長度無關。
4,零值標誌位ZF
  • 若運算結果各位全為0,則ZF被置1,否則置0。
5,符號標誌位SF
  • 將運算結果視為帶符號數,當運算結果為負數時SF被置1,為正數時,則置0
6,溢位標誌位OF
  • 當運算結果超過機器用補碼所能表示數的範圍時,則OF置1,否則置0.
  • 位元組資料,機器用補碼所能表示的數範圍為-128~+127。
    字資料的表示範圍為:-32768~+32767
注意:溢位與進位是兩個完全不同的概念,不能相互混淆。
7,單步標誌位TF
  • 單步標誌也叫跟蹤位,該標誌為控制標誌位。單步標誌位供除錯程式使用。
  • 當TF位被設定為1時,每執行一條指令後,CPU暫停執行,即產生單步中斷。
8,中斷允許標誌位IF
  • 該標誌位為控制標誌位。當IF被設定為1時,CPU可以響應可遮蔽中斷,否則不允許響應可遮蔽中斷。
9,方向標誌位DF
  • DF也是控制標誌位。它被用來規定串操作指令的增減方向。

2.3儲存器組織結構

一,儲存器的組成

1,儲存器是由若干個儲存單元構成

儲存單元的多少就表示了儲存器的容量。

2,每個儲存單元存放相同長度的二進位制數

一個儲存單元的長度一般為8位二進位制數,即一個位元組。

3,每個儲存單元有一個唯一的地址編號——地址

4,任何兩個相鄰位元組單元就構成一個字單元

  • 一個字儲存單元(WORD)的長度為16位二進
    制數,即兩個位元組。字單元的地址為兩個位元組單元中
    較小地址位元組單元的地址。
  • 16位長資料的存放規則是低8位放在較低地址字
    節單元中,高8位放在較高地址位元組單元中。

5,在定義一個地址時必須指出是位元組或字型別屬性

由於儲存單元可分為字單元和位元組單元,因此8086/8088CPU訪問記憶體的指令中,分為位元組訪問和字訪問兩種指令。

二,儲存器的段結構

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

1,8086/8088CPU將1MB的儲存空間劃分成若干個段,每個段最大長度為64K(65536)個位元組單元組成。
2,每個段的基址(段基址)必須是一個小節的首址。

段基址:一個段的起始地址。

3,邏輯段在物理儲存器中可以是鄰接的、間隔的、部分重疊的和完全重疊的等4種情況。
4,在任一時刻,一個程式只能訪問4個當前段中的內容。

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

1,實體地址

在1MB的儲存空間中,每個儲存單元的實體地址是唯一的,它就是該儲存單元的20位地址。

8086/8088的實體地址範圍:00000H~0FFFFFH

CPU與儲存器之間的任何資訊交換都使用實體地址。

2,邏輯地址

在程式設計中,為了便於程式的開發和對儲存器進行動態管理,使用了邏輯地址。

一個邏輯地址包括兩個部分:段基值和偏移量

段基值:存放在某一個段暫存器中,是一個邏輯段的起始單元地址(段基址)的高16位。

偏移量:表示某個儲存單元與它所在段的段基址之間的位元組距離

邏輯地址的表示方法:段基值,偏移量。

3,邏輯地址轉換為實體地址

  • 當CPU要訪問儲存器時,需要由匯流排介面單元BIU將邏輯地址轉換成實體地址。
  • 轉換方法:將邏輯地址的段基值左移4位,形成20位的段基址(低位為0)然後與16位的偏移量相加,結果即為20位的實體地址。

4,邏輯地址的來源

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

(1)允許替代來源也叫做段超越,它表示了段基值除使用隱含的段暫存器外是否可以指定其它段暫存器來提供。

(2)有效地址EA,它表示根據指令所採用的定址方式(下一章介紹)計算出來的段內偏移量

2,4堆疊及其操作方法

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

一,堆疊的構造

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

專用堆疊儲存器

按堆疊的工作方式專門設計的儲存器

軟體堆疊
  • 由程式設計人員用軟體在記憶體中劃出的一塊儲存區作為堆疊來使用。8086/8088採用這種方式。
  • 在堆疊中存取資料的規則是:“先進後出FILO” (First-InLast-Out)。即最先送入堆疊的資料要到最後才能取出,而最後送入堆疊的資料,最先取出。

二,8086/8088堆疊的組織

  • 頂由堆疊指標SP指示。SP中內容始終表示堆疊段基址與棧頂之間的距離(位元組數)。當SP內容為最大(初始)值時,表示堆疊為空。而當(SP)=0時,表示堆疊全滿.
  • 當SP被初始化時,指向棧底+2單元,其值就是堆疊的長度。由於SP是16位暫存器,因此堆疊長度≤64K位元組。
  • 資料在堆疊中的存放格式是:以為單位存放,資料的低8位放在較低地址單元,高8位放在較高地址單元
  • 當用戶程式中要求的堆疊長度超過一個堆疊段的最大長度64KB時,可以設定幾個堆疊段。
  • 通過改變堆疊段暫存器SS的內容,即可改變到另一個堆疊段,當改變了堆疊段暫存器SS的內容後,必須緊接著賦予SP新值。

三,堆疊操作

1,設定堆疊

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

2,進棧PUSH

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

進棧的執行過程

  • (1)首先將堆疊指標SP減2,即指向一個空的堆疊字單元
    SP<=(SP)-2
  • (2)將要儲存的內容(暫存器或儲存單元的內容)送入SP指向的字單元中。(SP)<=資料

出棧的操作過程

  • (1)將SP指向的字單元(即棧頂字單元)內容送往指定的暫存器或儲存器。即:暫存器/儲存器<=((SP))
  • (2)堆疊指標SP內容加2,即:SP<=(SP)+2


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

3.1定址方式

  • 一條指令通常由兩大部分構成:
    操作碼和運算元
操作碼

表示該指令應完成的具體操作,如加法、減法、乘法、移位等等。在組合語言中使用一定的符號來表示,稱為助記符。如ADD 、PUSH、POP、MOV等等。

運算元

表示該指令的操作物件。如移位操作的被移位數,加法操作的加數等等。它可以是一個運算元,也可以是多個運算元。這取決於操作碼部分的具體需要。

定址方式:

尋找指令中所需運算元的各種方法,也就是提供指令中運算元的存放資訊的方式。

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

(1)立即數運算元

(2)暫存器運算元

(3)儲存器運算元

(4)I/O埠運算元

1.立即數定址

立即數定址方式的指令中,所需運算元直接包含在指令程式碼中,這種運算元稱為立即數。立即數可以是8位,也可以是16位。

2.暫存器定址

暫存器定址方式是指指令中所需的運算元在CPU的某個暫存器中。暫存器可以是8位或16位通用暫存器,或者是段暫存器。如:AH、AL、AX、CX、DS、ES等。

3.直接定址

在直接定址方式的指令中,運算元的有效地址EA只有位移量地址分量。

4.暫存器間接定址

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

5.基址定址和變址定址

運算元的有效地址EA等於基地址分量或變址分量加上指令中給出的位移量。

6.基址變址定址

運算元的有效地址是三個地址分量之和,即:EA=基址+變址+位移量

7.串操作定址方式

8086/8088設定有專門用於串操作的指令,這些指令的運算元雖然也在儲存器中,但它們不使用前面介紹的各種定址方式,而隱含地使用變址暫存器SI和DI專門指示。

8. I/O埠定址

  • 儲存器編址方法
  • I/O埠編址方法

(1)直接埠定址

在指令中直接給出埠地址,埠地址一般採用2位十六進位制數,也可以用符號表示。

(2)暫存器間接埠定址

暫存器間接埠定址:把I/O埠的地址先送到DX中,用DX作間接定址暫存器。

3.2指令系統

  • 一種計算機所能執行的各種型別的指令的集合稱為該計算機的指令系統。
  • Intel8086/8088CPU指令系統的指令可以分為六大類:

1.傳送類指令

2.算術運算類指令

3.位操作類指令

4.串操作類指令

5.程式轉移類指令

6.處理器控制類指令

一,傳送類指令

  • 傳送類指令的作用是將資料資訊或地址資訊傳送到一個暫存器或儲存單元中,可以分為以下四種情況。

1.通用資料傳送指令

指令格式:MOV DEST,SRC

作用:將源運算元指定的內容傳送到目的運算元,即DEST<=(SRC)。

  • MOV指令可以分為以下幾種情況:

1)立即數傳送到通用暫存器或儲存單元

2)暫存器之間的傳送

3)暫存器與儲存單元之間傳送

2.交換指令

指令格式:XCHG DEST,SRC

作用:源運算元和目的運算元兩者內容相互交換,即:(DEST)<=>(SRC)。指令對標誌暫存器各位無影響

3.標誌傳送指令

1)取標誌暫存器指令

指令格式:LAHF

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

2)儲存標誌暫存器指令

指令格式:SAHF

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

3)標誌進棧指令

指令格式:PUSHF

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

4)標誌出棧指令

指令格式:POPF

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

4.地址傳送指令

  • 這類指令有3條,它們的作用是將儲存單元的地址送暫存器。

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)。

  • ADD指令可以是位元組運算元相加,也可以是字運算元相加。

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

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.標誌位操作指令
  • (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三個時鐘週期,它不改變任何暫存器或儲存單元內容,主要用於延時。

3.3 指令編碼

  • 將組合語言程式轉換為機器語言程式的過程稱為彙編
  • 將組合語言程式轉換為機器語言程式的過程稱為彙編
  • Intel8086/8088彙編指令的編碼格式有四種基本格式:

1.)雙運算元指令編碼格式

2.)單運算元指令編碼格式

3.)與AX或AL有關的指令編碼格式

4.)其它指令編碼格式

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

對於象MOV、ADD、AND等雙運算元指令,運算元可以是以下兩種情形

  • 一個運算元在暫存器中,另一運算元在暫存器或儲存器中。
  • 目的運算元在暫存器或儲存器中,源運算元是立即數。
1.操作特徵部分

1)OPCODE:操作碼欄位

2)方向欄位d

3)字/位元組欄位W

2.定址特徵部分
  • 它與操作特徵部分的方向欄位d結合,指定兩個運算元分別使用什麼定址方式,及使用哪個暫存器。
  • 它包括MOD、REG和R/M三個欄位,REG欄位確定一個運算元,而MOD和R/M欄位確定另一個運算元。

1)REG欄位

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

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

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

3.位移量部分

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

  • 沒有位移量
  • 1位元組位移量disp8
  • 2位元組位移量disp16
4.立即數部分

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

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

操作特徵部分:

  • 包括OPCODE 、V和W三個欄位,其中V欄位只有移位/迴圈指令中才有該欄位。其它指令中沒有該欄位。
  • V=0時,指令中使用常數1作為移位或迴圈次數。V=1時,指令中使用暫存器CL作移位次數。

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

這種編碼格式用於隱含指定AX/AL作為一個運算元的雙運算元指令。

採用這種編碼格式的指令,除一個運算元隱含指定為AX/AL外,另一個運算元可以是立即數或儲存單元。

  • 立即數:則編碼中應有1~2位元組的立即數
  • 儲存單元:只能使用直接定址方式,位移量由disp欄位給出

四、其它指令編碼格式

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


第四章 組合語言程式格式

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

  • 組合語言的語句可以分為指令語句和偽指令語句

一、指令語句

每一條指令語句在彙編時都要產生一個可供CPU執行的機器目的碼,它又叫可執行語句。

  • 1.標號欄位

標號是可選欄位,它後面必須有“:”。標號是一 條指令的符號地址,代表了該指令的第一個位元組存 放地址。

  • 2.指令助記符欄位

該欄位是一條指令的必選項,它表示這條語句要求
CPU完成什麼具體操作,如MOV、ADD、SHL等。

  • 3.運算元欄位

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

  • 4.註釋欄位

註釋欄位為可選項,該欄位以分號“;”開始。

它的作用是為閱讀程式的人加上一些說明性內容

註釋欄位不會產生機器目的碼,它不會影響程 序和指令的功能。

二、偽指令語句

偽指令語句又叫命令語句。

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

  • 1.符號名欄位

該欄位為可選項。根據偽指令的不同,符號名可 以是常量名、變數名、過程名、結構名和記錄名 等等。

  • 2.偽指令符欄位

該欄位是偽指令語句的必選項,它規定了彙編 程式所要完成的具體操作。本章後面的章節將對各種偽指令作詳細介紹。

  • 3.運算元欄位

該欄位是否需要,以及需要幾個是由偽指令符 欄位來決定。

  • 4.註釋欄位

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

三、識別符號

指令語句中的標號和偽指令語句中符號名統 稱為識別符號。識別符號是由若干個字元構成的。

  • 識別符號構成規則:

1)字元的個數為1~31個

2)第一個字元必須是字母、問號、@或下劃線“_”這4種字元之一

3)從第二個字元開始,可以是字母、數字、@ 、 “_”或問號“?”

4)不能使用屬於系統專用的保留字

4.2 組合語言資料

  • 資料是指令和偽指令語句中運算元的基本組 成部分。一個數據由數值屬性兩部分構成。
  • 在組合語言中常用的資料形式有:常數、變 量和標號。

一、常數

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

-(1)作指令語句的源運算元

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

二、變數

變數用來表示存放資料的儲存單元,這些資料在 程式執行期間可以被改變 。

1.變數的定義與預置

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

  • 當變數被定義後,就具有了以下三個屬性:

(1)段屬性

它表示變數存放在哪一個邏輯段中。

(2)偏移量屬性(OFFSET)

段屬性和偏移量屬性就構造了變數的邏輯地址

(3)型別屬性

它表示變數佔用儲存單元的位元組數。其中DB偽指令 定義的變數為位元組,DW定義的變數為字,DD定義的為 雙字(4位元組),DQ定義的為4字,DT定義的為5字

當變數被定義後,就具有了以下三個屬性:

(1)段屬性

它表示變數存放在哪一個邏輯段中

(2)偏移量屬性(OFFSET)

段屬性和偏移量屬性就構造了變數的邏輯地址

(3)型別屬性

它表示變數佔用儲存單元的位元組數。其中DB偽指令定義的變數為位元組,DW定義的變數為字,DD定義的為雙字(4位元組),DQ定義的為4字,DT定義的為5字。

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

(1)數值表示式

(2)?表示式

(3)字串表示式

(4)DUP表示式

2.變數的使用

(1)在指令語句中引用

在指令語句中直接引用變數名就是對其儲存單元的內容進 行存取

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

後面三條偽指令的運算元中都 包含了前面定義的兩個變數

三、標號

標號寫在一條指令的前面,它就是該指令在記憶體的 存放地址的符號表示,也就是指令地址的別名

每個標號具有三屬性

(1)段屬性(SEG)

(2)偏移量屬性(OFFSET)

(3)距離屬性(也叫型別屬性)

標號的距離屬性可以有兩種方法來指定

a.隱含方式

b.用LABEL偽指令給標號指定距離屬性

4.3 符號定義語句

一、等值語句

語句格式:符號名 EQU 表示式
  • 1.常數或數值表示式

COUNT EQU 5

NUM EQU COUNT+5

  • 2.地址表示式

ADR1 EQU DS:[BP+14]

  • 3.變數、暫存器名或指令助記符

二、等號語句

格式:符號名=表示式

4.4 表示式與運算子

一、算術運算子

1.運算子“+”和“-”也可作單目運算子,表示數的正負

2.使用“+”、“-”、“*”、和“/”運算子時,參加運算 的數和運算結果都是整數。

3.“/”運算為取商的整數部分,而“MOD”運算取除法運
算的餘數。

  1. “SHR ”和“SHL ”為邏輯移位運算子

5.下標運算子“[ ]”具有相加的作用

二、邏輯運算子

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

三、關係運算符

關係運算符包括:EQ(等於)、NE(不等於)、LT(小於)、 LE(小於等於)、GT(大於)、 GE(大於等於)

四、數值返回運算子

1.SEG運算子

作用: 取變數或標號所在段的段基值

2,OFFSET運算子

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

3.TYPE運算子

作用:取變數或標號的型別屬性,並用數字形式表示。對變數來說就是取它的位元組長度。

4.LENGTH運算子

該運算子用於取變數的長度。

5.SIZE運算子

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

五、屬性修改運算子

1.PTR運算子

使用格式
型別 PTR 地址表示式

作用
將地址表示式所指定的標號、變數或用其它形式表示的儲存器地址的型別屬性修改為 “型別”所指的值

2.HIGH/LOW運算子

使用格式

HIGH 表示式
LOW 表示式

3、THIS運算子

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

六、運算子的優先順序

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

彙編程式在計算表示式時,按以下規則進行運算
  • 先執行優先級別高的運算,再算較低級別運算
  • 相同優先級別的操作,按照在表示式中的順序,從 左到右進行
  • 可以用圓括號改變運算的順序

4.5 程式的段結構

  • 086/8088在管理記憶體時,按照邏輯段進行劃分, 不同的邏輯段可以用來存放不同目的的資料。在程式 中使用四個段暫存器CS,DS,ES和SS來訪問它們。

一、段定義偽指令

偽指令SEGMENT和ENDS用於定義一個邏輯段。使
用時必須配對,分別表示定義的開始與結束。

1、段名

段名是由使用者自己任意選定的,符合識別符號定義 規則的一個名稱。

2、定位型別

定位型別用於決定段的起始邊界,即第一個可存放資料 的位置(不是段基址)。它可以有4種取值。

  • 1)PAGE: 表示該段從一個頁面的邊界開始
  • 2)PARA:表示該段從一個小節的邊界開始 如果使用者未選定位型別,則預設為PARA。
  • 3)WORD:表示該段從一個偶數字節地址開始,即段起始單元地址的最後一位二進位制數一定是0
  • 4)BYTE:表示該段起始單元地址可以是任一地址值
3、組合型別
  • 1)若未指定組合型別,表示本段與其它段無連線關係。在 裝入記憶體時,本段有自己的物理段,因此有自己的段基址
  • 2)PUBLIC:在滿足定位型別的前提下,將與該段同名的 段鄰接在一起,形成一個新的邏輯段,共用一個段基址。段 內的所有偏移量調整為相對於新邏輯段的段基址。
  • 3)COMMON: 產生一個覆蓋段。在多個模組連線時,把 該段與其它也用COMMON說明的同名段置成相同的段基址, 這樣可達到共享同一儲存區。共享儲存區的長度由同名段中 最大的段確定。
  • 4)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的裝入

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

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

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

過程名是子程式的名稱,它被用作過程呼叫指令CALL的目 的運算元。它類同一個標號的作用。具有段、偏移量和距離 三個屬性。而距離屬性使用NEAR和FAR來指定,若沒有指定,則隱含為NEAR。
  • NEAR過程只能被本段指令呼叫,而FAR過程可以供其它段 的指令呼叫。

  • 每一個過程中必須包含有返回指令RET,其作用是控制CPU
    從子程式中返回到呼叫該過程的主程式。

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

彙編程式在彙編源程式時,每遇到一個邏輯段,就要為其 設定一個位置計數器,它用來記錄該邏輯段中定義的每一個 資料或每一條指令在邏輯段中的相對位置。
  • 定位偽指令ORG--用來改變位置計數器的值

格式: ORG 數值表示式

4.8 標題偽指令TITLE

語句格式:

TITLE 標題名

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

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

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

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

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

執行DOS功能呼叫4CH,也可以控制使用者程式結束, 並返回DOS作業系統。