1. 程式人生 > 其它 >20192415 2021-2022-2 《彙編程式設計》第1-4章學習總結

20192415 2021-2022-2 《彙編程式設計》第1-4章學習總結

20192415 2021-2022-2 《彙編程式設計》第1-4章學習總結

目錄

第一章 基礎知識

1.1 組合語言的一般概念

計算機程式設計語言可分為以下三類:

  • 機器語言

    • 機器能夠識別的語言。

    • 01構成的資訊資料指令等。包含指示運算功能的程式碼+參加運算的操作資料,表示非常詳細。

    • 最直接地表示了計算機內部的基本操作,用它編制的程式在計算機中執行的效率最高(執行速度最快,程式長度最短)。

  • 高階語言

    • 遮蔽計算機內部操作細節,類似自然語言,設計簡單,但程式效率較機器語言低。
  • 組合語言

    • 字母和符號表示機器語言的命令+十進位制數或十六進位制數表示資料。

    • 在計算機系統中,某些功能必須用匯編語言程式來實現(如:機器自檢、系統初始化等)。

1.2 組合語言程式與機器語言程式的關係

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

效率:機器語言=組合語言>高階語言

不同型別計算機有不同的機器指令系統和組合語言描述。組合語言與硬體密切聯絡。

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

在計算機中資料表示一般採用2進位制數,人書寫時常使用8進位制和16進位制。

1.4 帶符號數的表示

真值用“+”“-”表正負,機器數用“0”“1”表正負。

  • 帶符號的機器數可以用原碼、反碼和補碼錶示。一般計算機中大多采用補碼錶示。

  • 0的表示

    • 原碼:0 0000000 和 1 0000000

    • 補碼:0 0000000(1 0000000為-128或-1的補碼)

    • 反碼:0 0000000 和 1 1111111

  • 轉化為補碼

    • 正數

      與原碼相同,符號位為0,數值為二進位制絕對值

    • 負數

      真值→補碼

       (先補齊,最高位必然為0,取反後為1)各位取反後加一
      

      原碼→補碼

       符號位不變,其餘取反後加一
      
       或
         		
       自低向高,第一個“1”和右側“0”不變,其他位取反,符號位不變
      
  • 補碼的加減運算

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

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

    • 計算機內一般使用補碼運算(當運算結果不超機器範圍時):

         1.符號位參與運算,符號位進位自然丟掉
      
         2.求補運算[-Y]:將原數連同符號位一起(不管是正還是負)按位取反後加一。
      
         3.用補碼相加,和仍為補碼
      

1.5 字元的表示

字元(字母、符號、數字碼)按一定的方式編寫成二進位制資訊。

不同的計算機以及不同的場合所採用的編碼形式可能不同。

目前最廣泛採用的是ASCII碼。

  • 標準ASCII碼

    共有128個。

    每個為1位元組,低7位表示字元編碼,最高位表示奇偶數驗位。

  • 非列印ASCII碼

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

  • 可列印ASCII碼

    共95個,如數字符0~9,大小寫字母等。

     注:0F0H,當十六進位制第一個字元是字母的話前面加0
    

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

2.1 微機一般結構

一、微機的一般構成

一般計算機包括五大部件:運算器、控制器、儲存器、輸入裝置和輸出裝置。

匯流排分為3種,是計算機內部不同部件之間的傳輸通道,起控制+傳輸作用。

  • 1.中央處理器CPU(微處理器)= 運算器+控制器

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

  • 2.主儲存器(主存/記憶體)

    存放程式和資料;由儲存單元構成,儲存單元使用地址來標識,按地址進行儲存單元內容的存和取。

    大多數計算機儲存器以位元組為基本單位。每一個基本單位稱為一個儲存單元。

    指示儲存單元編號的地址長度決定了儲存器的最大容量,

    例如一個10位二進位制數表示的地址,可以用來區分1024=1K個單元。

    CPU+主儲存器=主機

    輔儲存器(輔存/外存):主存副本;當前不在執行的程式+資料

  • 3.輸入輸出裝置及介面

    輸入裝置將外部資訊(程式、資料和命令)送入計算機。

    輸出裝置將計算機處理後的結果轉換為人或其它系統能識別的資訊形式向外輸出。

    有的裝置既具有輸入功能又具有輸出功能。

    I/O裝置要通過I/O接口才能與系統匯流排連線。

  • 4.系統匯流排

二、Intel 8086/8088 CPU

CPU執行指令序列:從儲存器中取指令+執行指令規定的操作

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

  • 1.序列方式

    CPU指令執行階段,不佔用系統匯流排,系統匯流排的空閒時間多;

    從儲存器取指令、取存資料時,匯流排忙而CPU花費時間很短,大部分時間閒置。

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

  • 2.指令流水線方式

    CPU被劃分成兩個單元:執行單元(EU)+匯流排介面單元(BIU)

    兩者分工又合作,並行加快指令執行速度。

  • EU——分析與執行指令:

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

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

2.2 暫存器結構及其用途

一、通用暫存器 8個

  • 資料暫存器*4

    結構:H高位L地位,16位長的暫存器可以分為2個8位

    存放:參加運算的運算元/運算的結果

    使用:多數需明確指示;有些隱含使用;個別特定使用

  • 指標暫存器*2

    存放16位地址,在形成20位的實體地址時常被作為偏移量使用。

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

    • 基址指標BP:用來指向堆疊段內某一儲存單元。也可以存放運算元和運算結果。

  • 變址暫存器*2

    16位,一般被用來作地址指標,也可以用作通用資料暫存器存放運算元和運算結果。

    • 源變址暫存器SI

    • 目的變址暫存器DI

二、段暫存器 4個

CPU訪問儲存器時需要知道段基址和偏移量。段暫存器儲存段基址。

CPU在使用儲存器時,將它劃分成若干個段,每個段用來存放不同的內容(程式程式碼、資料等)。

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

三、指令指標IP

CPU從儲存器取指令時,IP內容作為偏移量。

當CPU從記憶體中取出一條指令後,IP內容自動修改為指向下一條指令。

不能用指令給IP賦值,但可通過某些指令的執行而自動修改IP的內容。如:

四、標誌暫存器

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

標誌暫存器的長度為16位,但只定義了其中的9位。

其中,CF、PF、AF、ZF、SF、OF為狀態標誌;TF、DF、IF為控制標誌。
  • 1.進位標誌位CF

    算術運算,若最高位(字第15 位,位元組第7位)產生進位或借位時,CF置1否則置0;

    移位類指令,CF被用來存放從最高位(左移時)或最低位(右移時)移出的數值(0或1)。

  • 2.奇偶標誌位PF

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

  • 3.輔助進位標誌位AF

    算術運算,若低位元組的低4位向高4位產生進位或借位,AF置1否則置0;

    AF標誌位用於十進位制運算的調整。

  • 4.零值標誌位ZF

    運算結果各位全為0,ZF置1否則置0。

  • 5.符號標誌位SF

    將運算結果視為帶符號數,運算結果為負數SF置1、為正數SF置0。

    第7位是位元組運算元的符號位,第15位是字運算元的符號位,因此SF位與運算結果的最高位相同。

  • 6.溢位標誌位OF

    當運算結果超過機器用補碼所能表示數的範圍時,OF置1否則置0。

    位元組資料補碼錶示範圍:-128 ~+127。

    字資料補碼錶示範圍為:-32768 ~+32767

  • 7.單步標誌位TF

    單步標誌也叫跟蹤位,供除錯程式使用。

    當TF=1時,每執行一條指令後CPU暫停執行,即產生單步中斷。

  • 8。中斷允許標誌位IF

    當IF=1時,CPU可以響應可遮蔽中斷,否則不允許響應可遮蔽中斷。

  • 9.方向標誌位DF

    DF被用來規定串操作指令的增減方向。

    當DF=0時,串操作指令自動使變址暫存器(SI和DI)的內容遞增。

    當DF=1時,串操作指令自動使變址暫存器的內容遞減。

    注:進位和溢位完全不同

    進位標誌表示無符號數運算結果是否超出範圍,運算結果仍然正確;

    溢位標誌表示有符號數運算結果是否超出範圍,運算結果已經不正確。

    判斷運算結果溢位的簡單規則:當兩個相同符號數相加,運算結果符號與原資料符號相反時,產生溢位,運算結果不正確。其他情況下,不會產生溢位。

2.3 儲存器組織結構

一、儲存器的組成

儲存器是由若干個儲存單元構成,一個儲存單元的長度一般為1個位元組。

每個儲存單元有一個唯一的地址編號。若有20根地址線,則可產生20位的地址碼,儲存器定址能力為1兆位元組空間。

在定義一個地址時必須指出是位元組或字型別屬性。儲存單元可分為字單元和位元組單元,而訪問記憶體的指令分為位元組訪問和字訪問兩種指令。

任何兩個相鄰位元組單元就構成一個字單元(WORD)。字單元的地址為兩個位元組單元中較小地址位元組單元的地址。16位長資料的存放規則是低8位放在較低地址位元組單元中,高8位放在較高地址位元組單元中。

二、儲存器的段結構

8086/8088CPU將1MB的儲存空間劃分成若干個段,每個段最大長度為64K(2^16)個位元組組成。

在儲存器中規定從0地址開始,每16個位元組稱為一個小節。1MB記憶體就可劃分為64K個小節。每個段的基址必須是一個小節的首址(小節首址最低位必為0)。

記憶體中的一個物理儲存單元可以映象到一個或多個邏輯段(在組合語言源程式中設定的段)中。邏輯段在物理儲存器中可以是鄰接的、間隔的、部分重疊的和完全重疊的等4種情況。
在任一時刻,一個程式只能訪問4個當前段(程式碼段、資料段、堆疊段和附加段,由4個段暫存器CS、DS、SS和ES分別儲存段基值)中的內容。

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

  1. 實體地址

    在儲存空間中,每個儲存單元的實體地址是唯一的。

  2. 邏輯地址

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

    邏輯地址=段基值+偏移量

    對於一個64K的段,偏移量為0FFFFH時,就是這個段的最後一個位元組單元。

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

    CPU訪問儲存器時,由BIU將邏輯地址轉實體地址。

    方法:段基值左移4位補0+16位的偏移量

  4. 邏輯地址的來源

    允許替代來源(段超越):段基值除使用隱含的段暫存器外是否可以指定其它段暫存器提供。

    有效地址EA:根據指令所採用的定址方式計算出來的段內偏移量。

2.4 堆疊及其操作方法

堆疊是一個特定的儲存區,存取時先進後出,主要用於暫存資料、在過程呼叫或處理中斷時儲存斷點資訊。
  • 分類:專用堆疊儲存器、軟體堆疊(用軟體在記憶體中劃出)。

  • 結構:

      棧底固定,堆疊儲存區的最大地址單元;棧頂浮動,隨存放資訊的多少而改變。
    
      堆疊指標SP始終指向棧頂單元,堆疊中資料進出都由SP控制。
    
      SP為堆疊段基址與棧頂之間的距離(位元組數)。
    
      當SP內容為最大(初始)值時,堆疊為空(SP指向棧底+2單元,其值是堆疊長度,堆疊長度小於等於64K位元組);當SP=0時,堆疊全滿。
    
      改變堆疊段暫存器SS的內容,即可改變到另一個堆疊段;當改變了SS的內容後,必須緊接著賦予SP新值。
    
  • 操作:設定堆疊賦值SS和SP;進棧PUSH;出棧POP。

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

3.1定址方式

指令=操作碼+運算元

定址方式:: 尋找指令中所需運算元的各種方法。

  1. 立即數運算元 運算元包含在指令程式碼中。

    立即數作為指令的一部分直接從BIU的指令佇列中取出,不需另外佔用匯流排週期,執行速度快。

    立即數只能作為源運算元,而不能作為目的運算元。

  2. 暫存器運算元 運算元在CPU的通用暫存器或段暫存器中。

    暫存器可以是8位或16位通用暫存器,或者是段暫存器。

    存取暫存器運算元完全在CPU內部進行,不需要匯流排週期,執行速度很快。

  3. 直接定址

    EA 從 位移量(可用符號或常數表示)獲得

     注:用常數表示時,必須用方括號括起來。段暫存器不能省略。
    
  4. 暫存器間接定址

    EA 從 基址暫存器(BX或BP)或 變址暫存器(SI或DI)獲得

     注:指令使用BP暫存器,隱含使用SS段暫存器;其餘隱含使用DS段暫存器。
    
  5. 基址定址/變址定址

    EA = 基址分量或變址分量 + 指令中的位移量。

    指令中使用BX或BP為基址定址;指令中使用SI或DI為變址定址。

  6. 基址變址定址

    EA = 基址 + 變址 + 位移量

    最靈活,可以方便地對二維陣列進行訪問。

  7. 串操作定址方式

    使用SI和DI專門指示

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

    (1)儲存器編址方法

    (2)I/O埠編址方法

3.2 指令系統

一種計算機所能執行的各種型別的指令的集合

分類

  • 按種類分

    1. 傳送類指令
    2. 算術運算類指令
    3. 位操作類指令
    4. 串操作類指令
    5. 程式轉移類指令
    6. 處理器控制類指令
  • 按格式分

    1. 雙運算元指令:OPR DEST SRC

    2. 單運算元指令:OPR DEST

    3. 無運算元指令:OPR

       無運算元指令包含:
       (1)指令不需要運算元,如暫停指令HLT。
       (2)在指令格式中,沒有顯式指明運算元,但隱含指明瞭運算元的存放地方,如指令PUSHF。 
      

一、傳送類指令

將資料資訊或地址資訊傳送到暫存器或儲存單元。
  1. 通用資料傳送指令

    • 指令格式:MOV DEST,SRC

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

      指令執行完後,目的運算元和源運算元內容相同。

       注:	MOV指令不影響標誌暫存器(無運算);
      
       	MOV指令源、目的運算元的長度須一致;
      
       	立即數只能作為源運算元,且不能傳送給段暫存器(存放段基址,不能輕易改變);
      
       	段暫存器CS(程式程式碼很重要)只能作源運算元,不能作目的運算元;
      
       	段暫存器之間、儲存單元(SI是暫存器,[SI]是儲存器)之間不能直接傳送資料。
      
  2. 交換指令

    • 指令格式:XCHG DEST,SRC

    • 作用:源運算元和目的運算元內容互換,即(DEST)<=>(SRC)。

       注:	XCHG指令不影響標誌暫存器;
      
       		通用暫存器(不包括段暫存器)之間可交換資料;
      
       		通用暫存器與儲存單元之間可交換資料;
      
       		儲存單元之間不可直接交換資料。
      
  3. 標誌傳送指令

    都是無運算元指令,即指令隱含指定標誌暫存器、AH暫存器或堆疊為運算元。

    • (1)取標誌暫存器指令 LAHF 將標誌暫存器的低8位送入AH暫存器(共8位),指令執行不影響標誌暫存器。

    • (2)儲存標誌暫存器指令 SAHF 將AH中的第7、6、4、2、0位分別送入標誌暫存器的SF、ZF、AF、PF和CF各標誌位。不影響標誌暫存器高8位。

    • (3)標誌進棧指令 PUSHF 堆疊指標SP減2,標誌暫存器16位(堆疊均已字為單位)進棧

    • (4)標誌出棧指令 POPF SP指向的堆疊頂部的一個字單元送入標誌暫存器後SP加2

  4. 地址傳送指令

  • (1)裝入有效地址

    • 指令格式:LEA DEST,SRC

      源運算元SRC為一個位元組或字的儲存器運算元(地址),DEST為16位通用暫存器

    • 作用:將SRC儲存單元地址中的偏移量,即有效地址EA傳送到一個16位通用暫存器(傳送的是一個地址,而不是地址記憶體的資料)

  • (2)裝入地址指標指令

    • 指令格式:LDS/LES DEST,SRC

      DEST是任意一個16位通用暫存器,SRC必須是一個儲存器運算元

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

二、算術運算類指令

加、減、乘、除指令,可對位元組或字資料進行運算。

資料可以是無符號數,也可以是帶符號數(補碼錶示)。

資料可以是二進位制數,也可以是十進位制數(BCD碼錶示)。

  1. 加法指令

    • 指令格式:ADD DEST, SRC

    • 作用:DEST <= (DEST) + (SRC),源運算元內容不變。相加結果將影響狀態標誌。

        注:
        DEST只能是通用暫存器或儲存器運算元,不能是立即數;
        SRC可以是通用暫存器、儲存器或立即數運算元;
        DEST和SRC不能都為儲存器運算元。
      
  2. 帶進位加法指令

    • 指令格式:ADC DEST, SRC

    • 作用:DEST <= (DEST) + (SRC) + CF。可實現資料長度大於16位的兩數相加。相加結果將影響狀態標誌。

  3. 加1指令

    • 指令格式:INC DEST

    • 作用:DEST <= (DEST)+1。影響除CF以外的其他狀態標誌。主要用於計數器計數和修改地址指標。

        注:
        DEST可以是任意的8位、16位通用暫存器或儲存器運算元;
        DEST被視為帶符號二進位制數。
      
  4. 減法指令

    • 指令格式:SUB DEST, SRC

    • 作用:DEST <= (DEST) - (SRC),SRC不變。操作結果將影響狀態標誌。

        注:
        DEST和SRC可以是8位或16位的通用暫存器、儲存器運算元,
        但兩者不能同時為儲存器運算元;
        立即數只能作源運算元
      
  5. 帶借位減法

    • 指令格式:SBB DEST,SRC

    • 作用:DEST <= (DEST) - (SRC) - CF,SRC不變。

      主要用於長度大於16位的數相減。

      操作結果將影響狀態標誌。

  6. 減1指令

    • 指令格式:DEC DEST

    • 作用:DEST<=(DEST) - 1。影響除CF以外的其他狀態標誌。主要用於計數和修改地址指標,計數方向與INC指令相反。

        注:
        DEST可以是任意的8位、16位通用暫存器或儲存器運算元;
        DEST被視為帶符號二進位制數。
      
  7. 求負數指令(取補指令)

    • 指令格式:NEG DEST

    • 作用:DEST <= 0 - (DEST)。影響狀態標誌。主要用於計數和修改地址指標,計數方向與INC指令相反。

        注:
        DEST可以是任意8位、16位的通用暫存器或儲存器運算元;
        DEST被視為帶符號二進位制數。
        影響進位標誌CF——運算元為零時CF置零,其它情況置1
        影響溢位標誌OF——當位元組運算元為-128或字運算元為-32768時,執行NEG指令的結果運算元無變化,但OF被置1。
      

三、位操作類指令

  1. 邏輯運算指令

    與:AND DEST, SRC

    或:OR DEST, SRC

    異或:XOR DEST, SRC

    非:NOT DEST

    • 作用:執行按位邏輯運算。對位元組或字資料的某些位的組合、分離或位設定。

        注:
        DEST和SRC可以是8位、16位的通用暫存器或儲存器運算元,
        但兩者不能同時為儲存器運算元;SRC可以為立即數。
        NOT指令不影響狀態標誌;
        其餘三條將影響SF、ZF和PF,而CF和OF總置0,AF不確定。
      

    舉例:中斷標誌位IF清零

    思考:為什麼不能直接對標誌暫存器進行AND運算?為什麼不能使用MOV指令將標誌暫存器放入AX?

    邏輯運算指令的DEST和SRC可以是8位、16位的通用暫存器;而中斷標誌位在標誌暫存器,必須先用標誌傳送指令把它取出進入堆疊再進入通用暫存器。標誌傳送指令是專門對標誌暫存器進行存取的指令,MOV指令對標誌暫存器的各位無影響。

  2. 測試指令

    • 指令格式:TEST DEST, SRC

    • 作用:類似AND指令,DEST與SRC進行按位“邏輯與”運算,但運算結果不送入DEST(DEST保持不變)。主要用於測試某一運算元的一位或幾位的狀態。

      思考:測試後跳轉,是如何跳轉的?JZ是什麼?

      使用JZ TARGET進行跳轉。JZ=jump if zero (結果為0則設定ZF零標誌為1,跳轉)

  3. 移位/迴圈移位指令

四、處理器控制類指令

3.3 指令編碼

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

  1. 操作特徵部分

    指令編碼首位元組,分為以下三段:

    (1) OPCODE:操作碼欄位

     該欄位長度為6bit。它表示了該指令所執行的功能和兩個運算元的來源。
    

    (2)方向欄位d

     該欄位與第2部分定址特徵一起來決定源運算元和目的運算元的來源。
    

    (3)字/位元組欄位W

     當W=1時,表示兩運算元長度為字;當W=0時,表示兩運算元長度為位元組。
    
  2. 定址特徵部分

    d=l時,目的運算元由REG確定,而源運算元由MOD和R/M確定

    d=0時,目的運算元由MOD和R/M確定,而源運算元由REG確定

    (1) REG欄位

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

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

     兩個欄位共同確定一個運算元。該運算元可在暫存器中,也可在儲存器中
    
  3. 位移量部分

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

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

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

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

適用於只有一個運算元的指令。指令編碼為2〜3位元組。
  • 操作特徵

    包括OPCODE、V和W三個欄位,其中V欄位只有移位/ 迴圈指令中才有該欄位。其它指令中沒有該欄位。

      V=0時,指令中使用常數1作為移位或迴圈次數;
      V=1時,指令中使用暫存器CL作移位次數。
    

    由於單運算元指令中只有一個運算元,因此定址特徵部分就不需要REG欄位,而該欄位被用作輔助操作碼。

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

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

四、其它指令編碼格式

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

第四章 組合語言程式格式

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

一、指令語句

  1. 標號欄位

    可選欄位,後面必須有“:”。

    標號是一條指令的符號地址,代表了該指令的第一個位元組存放地址。

    標號一般放在一個程式段或子程式的入口處,控制程式的執行轉到該程式位置。

  2. 指令助記符欄位

    必選項,要求CPU完成什麼具體操作。

    有些指令還可在指令助記符的前面加上字首,實現一定的附加操作。

  3. 運算元欄位

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

  4. 註釋欄位

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

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

    不會產生機器目的碼,不會影響程式和指令的功能。

二、偽指令語句

又叫命令語句。

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

    可選項。

    根據偽指令的不同,符號名可是常量名、變數名、過程名、結構名和記錄名。

    一條偽指令語句的符號名可以作其它偽指令語句或指令語句的運算元,這時它表示一個常量或儲存器地址。

  2. 偽指令符欄位

    必選項,規定了彙編程式所要完成的具體操作。

  3. 運算元欄位

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

    運算元可以是一個常數

  4. 註釋欄位

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

三、識別符號

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

	識別符號構成規則:
		1.字元的個數為1〜31個
		2.第一個字元必須是字母、問號、@或下劃線“” 這4種字元之一
		3.從第二個字元開始,可以是字母、數字、@、“”或問號?
		4.不能使用屬於系統專用的保留字。

4.2 組合語言資料

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

一、常數

  1. 二進位制數:字母B結尾

  2. 八進位制數:字母O或Q結尾

  3. 十進位制數:字母D結尾,或者沒有結尾字母

  4. 十六進位制數:字母H結尾,如果常數的第一個數字為字母,為了與識別符號加以區別,必須在其前面冠以數字“0”

  5. 實數

  6. 字串常數:用引號(單引號或雙引號)括起 來的一個或多個字元,這些字元以它的ASCII碼 值儲存在記憶體

     常數在程式中可以用在以下幾種情況:
    
     (1)作指令語句的源運算元
     (2)在指令語句的直接定址方式、變址(基址)尋 址方式或基址變址定址方式中作位移量。
     (3)在資料定義偽指令中使用
    

二、變數

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

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

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

    給變數賦初值的表示式可以使用4種形式:

    (1)數值表示式

    (2)?表示式

    (3)字串表示式

    (4) DUP表示式

  2. 變數的使用

    (1)在指令語句中引用

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

三、標號

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

標號主要用在程式中需要改變程式的執行順序時, 用來標記轉移的目的地,即作轉移指令的運算元。

每個標號具有三屬性:

	(1)段屬性(SEG):表示該標號所代表的地址在娜個邏輯段中,即段基值。

	(2)偏移量屬性(OFFSET):表示該標號所代表的地址在段內與段起點間的位元組 數,即地址的偏移量。

	(3)距離屬性(也叫型別屬性):表示該標號可以被段內還是段間的指令呼叫。

		NEAR (近): 該標號只能作段內轉移,也就是說只能是與該標號所指指令同在一個邏輯段的轉移指令和呼叫指令才能使用它。
		FAR (遠): 該標號可以被非本段的轉移和呼叫指令使用。

		標號的距離屬性可以右兩種方法來指定:
		a.隱含方式
		b.用LABEL偽指令給標號指定距離屬性

4.3符號定義語句

一、等值語句

  • 格式:符號名 EQU 表示式

  • 功能:用符號名來表示EQU右邊的表示式。後面的程式中 一旦岀現該符號名,彙編程式將把它替換成該表示式。

    表示式可以是任何形式,常見的以下:

      1.常數或數值表示式
    
      2.地址表示式
    
      3.變數、暫存器名或指令助記符
    

二、等號語句

  • 格式:符號名=表示式

  • 功能:等號語句與等值語句具有相同的作用。但等號語句可以對一個符號進行多次定義。

4.4 表示式與運算子

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

一、算術運算子

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

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

二、邏輯運算子

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

三、關係運算符

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

四、數值返回運算子

  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連用,用來定義一個變數或標號的型別屬性。

    所定義的變數或標號的段基值利偏移量與緊跟其後的變數或標號相同。

六、運算子的優先順序

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